我正在编写一个特性,在其中我读并写回了json。但是,我可以从文件中读取json元素,但不能编辑相同加载的对象。这是我正在做的代码。
InputStream inp = new FileInputStream(jsonFilePath);
JsonReader reader = Json.createReader(inp);
JsonArray employeesArr = reader.readArray();
for (int i = 0; i < 2; i++) {
JsonObject jObj = employeesArr.getJsonObject(i);
JsonObject teammanager = jObj.getJsonObject("manager");
Employee manager = new Employee();
manager.name = teammanager.getString("name");
manager.emailAddress = teammanager.getString("email");
System.out.println("uploading File " + listOfFiles[i].getName());
File file = insertFile(...);
JsonObject tmpJsonValue = Json.createObjectBuilder()
.add("fileId", file.getId())
.add("alternativeLink", file.getAlternateLink())
.build();
jObj.put("alternativeLink", tmpJsonValue.get("alternativeLink")); <-- fails here
}运行它时,我会得到以下异常。
线程"main“java.lang.UnsupportedOperationException中的异常 在java.util.AbstractMap.put(AbstractMap.java:203) 在com.mongodb.okr.DriveQuickstart.uploadAllFiles(DriveQuickstart.java:196) 在com.mongodb.okr.App.main(App.java:28)
发布于 2015-11-20 00:45:56
JsonObject态
JsonObject类表示一个不变的 JSON对象值(零个或多个名称/值对的无序集合)。它还为JSON对象名称/值映射提供了不可修改的映射视图。
你不能修改这些对象。
你需要创建一个副本。似乎没有一种直接的方法可以做到这一点。看起来您需要使用Json.createObjectBuilder()并自己构建它(参见javadoc链接中的示例)。
发布于 2020-06-03 07:53:36
Sotirios回答说,您可以使用JsonObjectBuilders。要将值插入到JsonObject中,可以使用方法:
private JsonObject insertValue(JsonObject source, String key, String value) {
JsonObjectBuilder builder = Json.createObjectBuilder();
builder.add(key, value);
source.entrySet().
forEach(e -> builder.add(e.getKey(), e.getValue()));
return builder.build();
}要将JsonObject插入到JsonObject中,可以使用以下方法:
private JsonObject insertObject(JsonObject parent, JsonObject child, String childName) {
JsonObjectBuilder child_builder = Json.createObjectBuilder();
JsonObjectBuilder parent_builder = Json.createObjectBuilder();
parent.entrySet().
forEach(e -> parent_builder.add(e.getKey(), e.getValue()));
child.entrySet().
forEach(e -> child_builder.add(e.getKey(), e.getValue()));
parent_builder.add(childName, child_builder);
return parent_builder.build();
}请注意,如果您在将子JsonObject插入另一个“父”JsonObject后更改它,它将不会对“父”JsonObject产生任何影响。
发布于 2021-09-29 13:38:38
JsonObject是不可变的,因此您不能修改对象,可以使用此示例并尝试从中激发灵感:创建包含相同值的新JsonObject并向其添加一些元素。
示例:
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonReader;
import javax.json.JsonValue;
public class Jsonizer {
public static void main(String[] args) {
try {
String s = "{\"persons\": [ {\"name\":\"oussama\",\"age\":\"30\"}, {\"name\":\"amine\",\"age\":\"25\"} ]}";
InputStream is = new ByteArrayInputStream(s.getBytes());
JsonReader jr = Json.createReader(is);
JsonObject jo = jr.readObject();
System.out.println("Before :");
System.out.println(jo);
JsonArray ja = jo.getJsonArray("persons");
InputStream targetStream = new ByteArrayInputStream("{\"name\":\"sami\",\"age\":\"50\"}".getBytes());
jr = Json.createReader(targetStream);
JsonObject newJo = jr.readObject();
JsonArrayBuilder jsonArraybuilder = Json.createArrayBuilder();
jsonArraybuilder.add(newJo);
for (JsonValue jValue : ja) {
jsonArraybuilder.add(jValue);
}
ja = jsonArraybuilder.build();
JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder();
jsonObjectBuilder.add("persons", ja);
JsonObject jsonAfterAdd = jsonObjectBuilder.build();
System.out.println("After");
System.out.println(jsonAfterAdd.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}输出:
Before :
{"persons":[{"name":"oussama","age":"30"},{"name":"amine","age":"25"}]}
After
{"persons":[{"name":"sami","age":"50"},{"name":"oussama","age":"30"},{"name":"amine","age":"25"}]}https://stackoverflow.com/questions/33817045
复制相似问题