2015-11-20 91 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