【问题标题】:How to modify the JSON data and return the updated JSON data如何修改 JSON 数据并返回更新后的 JSON 数据
【发布时间】:2017-06-28 20:15:57
【问题描述】:

我们中间有个需求更新JSON数据,需要用java返回更新的JSON数据。它还应该支持任何类型的 JSON 数据。

例如: 假设 {object:{"color":"red","shape":"Triangle"}} 是 JSON 数据,此时我们需要将 shape 的值更新为 Rectangle,我们需要返回更新后的 JSON 数据,如下所示:

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

为此,我们需要将元素路径(我们需要更新哪个元素)和 updateText 和 JSON 数据传递给 JAVA 代码。

这里是方法调用:

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;      
}

【问题讨论】:

    标签: java json


    【解决方案1】:

    问题在于您进行替换的方式。当您将 JsonObject 转换为 String 时,您会丢失该对象,并且在替换之后,您只需要替换的 String。要修复它,您需要直接对对象进行操作,而不是 String 对应项。因为 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();      
    }
    

    【讨论】:

    • 嗨普拉德普,感谢您的回复。在此代码中,returnVal 指的是在 for 循环内部修改的变量 jsonObject。最后它返回最里面的 JSONObject,其中包含我们的 JSON 值 JSONArray 或 value。例如:在此示例中,此代码返回 {"color":"red","shape":"Triangle"} 并省略 {"Object"} 它应该返回:{object:{"color":"red","shape":"Rectangle"}}(它应该使用修改后的 val 重新构建整个 JSON 对象)
    【解决方案2】:

    您可以为此使用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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多