2015-04-22 181 views
2

我們需要更新中間的JSON數據,並且需要使用java返回更新的JSON數據。它也應該支持任何類型的JSON數據。如何修改JSON數據並返回更新的JSON數據

例如: 假設{object:{"color":"red","shape":"Triangle"}}是JSON數據,並在這方面我們需要更新shapeRectangle,我們需要如下返回更新JSON數據:

{object:{"color":"red","shape":"Rectangle"}} 

爲此,我們需要通過元素路徑(我們需要更新哪個元素)以及updateText和JSON數據到JAVA代碼。

這裏是methodCall:

updateValue("object/shape", "Rectangle", "{object:{"color":"red","shape":"Triangle"}}") 

我們使用GSON庫嘗試下面的代碼。但是通過這段代碼,我們可以更新目標Json元素,但是需要返回整個JSON數據和更新後的值。

所以請建議我們如何使用更新的文本重新構建JSON數據。

下面是我們嘗試更新Json數據的代碼。

public String updateValue(String keyPath, String updateText, String jsonText) { 
    String[] keys = keyPath.split("/"); 
    JsonParser jsonParser = new JsonParser(); 
    JsonObject jsonObject = (JsonObject) jsonParser.parse(jsonText); 
    String result = ""; 
    for(String key : keys) 
    { 
     if (jsonObject.get(key) instanceof JsonObject) 
     { 
      jsonObject = (JsonObject)jsonObject.get(key); 
     } 
     else if(jsonObject.get(key) instanceof JsonArray) 
     { 
      JsonArray jsonArray = (JsonArray)jsonObject.get(key); 
      result = jsonArray.toString(); 
     } 
     else 
     { 
      result = jsonObject.get(key).toString(); 
     }   
    } 
    result = result.replace(result, updateText); 
    return result;  
} 

回答

1

問題出在你做替換的方式。將JsonObject轉換爲字符串時,會丟失該對象,並且在替換之後,您只需要替換的字符串。爲了解決這個問題,你需要直接操作對象,而不是字符串對象。由於JsonObject是可變的,因此保持對輸入的引用將反映更改。一個缺點是你不能用這種方式替換JsonArray中的值,部分原因是你不知道要替換哪個元素。要做到這一點,您需要在輸入中添加更多內容(替換值或元素位置)。

public String updateValue(String keyPath, String updateText, String jsonText) { 
    String[] keys = keyPath.split("/"); 
    JsonParser jsonParser = new JsonParser(); 
    JsonObject jsonObject = (JsonObject) jsonParser.parse(jsonText); 
    JsonObject returnVal = jsonObject; // This holds the ref to target json object 
    JsonPrimitive jp = new JsonPrimitive(updateText); 
    String finalKey = keys[keys.length - 1]; 
    for(String key : keys) 
    { 
     if (jsonObject.get(key).isJsonObject()) 
     { 
      jsonObject = (JsonObject)jsonObject.get(key); 
     } 
    } 
    jsonObject.remove(finalKey); 
    jsonObject.add(finalKey, jp); 
    return returnVal.toString();  
} 
+0

嗨Praddep, 感謝您的迴應。在這段代碼中,** returnVal **指的是變量** jsonObject **,它修改了循環內部。 並fin'ly它返回最內層的JSONObject,其中包含我們的JSON值或者JSONArray或值。 ex:在這個例子中,這個代碼返回'{「color」:「red」,「shape」:「Triangle」} 並省略'{「Object」}' 它應該返回: '{object:{「顏色「:」紅色「,」形狀「:」矩形「}}'(它應該重新構建具有修改的val的整個JSON對象) –

0

您可以使用JsonPath lib來嘗試使用以下代碼。

private static final Configuration configuration = Configuration.builder() 
    .jsonProvider(new JacksonJsonNodeJsonProvider()) 
    .mappingProvider(new JacksonMappingProvider()) 
    .build(); 

JsonNode updatedJson = JsonPath.using(configuration).parse(originaljson) 
    .set("use the path to go for value", "new value").json(); 
json = updatedJson.toString();