2015-11-20 43 views
5

我正在编写一个读取和写回json的功能。不过,我可以从文件中读取json元素,但不能编辑相同的加载对象。这是我正在处理的代码。如何修改一个javax.json.JsonObject对象?

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 

    } 

我运行它时出现以下异常。

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) 

回答

6

javadoc of JsonObject状态

JsonObject类表示不可改变 JSON对象值(零个或多个名称/值对的 无序集合)。它也为 提供了对JSON对象名称/值映射的不可修改的映射视图。

您不能修改这些对象。

您需要创建副本。似乎没有直接的方法来做到这一点。看起来您需要使用Json.createObjectBuilder()并自己构建它(请参阅链接的javadoc中的示例)。

+0

谢谢。这听起来正确,但创造一个新的对象是乏味的。纵观Gson,如果他们有一些简单的方法。 – wayfare

+0

@Himanshu Gson有自己的可变JsonObject。或者,杰克逊拥有“ObjectNode”,它也是可变的。 –

+0

是否有任何主要偏好?我只需要阅读 - >编辑 - >保存。 – wayfare