Reputation: 1850
I am coding a feature in which I read and write back json. However I can read the json elements from a file but can't edit the same loaded object. Here is my code which I am working on.
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
}
I get the following exception when I run it.
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractMap.put(AbstractMap.java:203)
at com.mongodb.okr.DriveQuickstart.uploadAllFiles(DriveQuickstart.java:196)
at com.mongodb.okr.App.main(App.java:28)
Upvotes: 13
Views: 8972
Reputation: 6615
Try using the simple JSONObject, not javax.
import org.json.JSONObject;
You can download the jar or include it in your maven or gradle like so:
dependencies {
compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
}
also see: creating json string using JSONObject and JSONArray
Upvotes: -1
Reputation: 101
As answered by Sotirios, you can use JsonObjectBuilders. To insert value into JsonObject, you can use method:
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();
}
To insert JsonObject into JsonObject, you can use method:
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();
}
Please note, if you change the child JsonObject after inserting it into another "parent" JsonObject, it will have no effect on the "parent" JsonObject.
Upvotes: 4
Reputation: 279890
The javadoc of JsonObject
states
JsonObject
class represents an immutable JSON object value (an unordered collection of zero or more name/value pairs). It also provides unmodifiable map view to the JSON object name/value mappings.
You can't modify these objects.
You'll need to create a copy. There doesn't seem to be a direct way to do that. It looks like you'll need to use Json.createObjectBuilder()
and build it yourself (see the example in the javadoc linked).
Upvotes: 16