Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Modify a javax.json.JsonObject Object?

Tags:

java

json

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)

like image 888
wayfare Avatar asked Nov 20 '15 00:11

wayfare


People also ask

Is JSON object mutable?

JsonObject is immutable so you cannot modify the object , you can use this example and try to inspire from it : creation of a new JsonObject who contains the same values and add some elements to it ..

What is difference between JSON object and JSON object?

JSONObject is "native" to Android SDK, JsonObject is probably the one from Gson library, the one that I use. Two different package, don't work with both ;) choose one. I had some issue with the date formatting in JSONObject.


2 Answers

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).

like image 162
Sotirios Delimanolis Avatar answered Oct 24 '22 05:10

Sotirios Delimanolis


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.

like image 43
Lubos Prague Avatar answered Oct 24 '22 05:10

Lubos Prague