如何修改JSON数据并返回更新的JSON数据

时间:2015-04-22 17:14:23

标签: java json

我们需要在中间更新JSON数据,并且需要使用java返回更新的JSON数据。它也应该支持任何类型的JSON数据。

例如: 假设{object:{"color":"red","shape":"Triangle"}}是JSON数据,我们需要将shape值更新为Rectangle,我们需要返回更新的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;      
}

2 个答案:

答案 0 :(得分: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();      
}

答案 1 :(得分: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();