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

标签 java json

我们中间有一个更新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;      
}

最佳答案

问题在于您进行替换的方式。当您将 JsonObject 转换为 String 时,您丢失了该对象,并且在替换之后,您只有被替换的 String。要修复它,您需要直接对对象进行操作,而不是 String 对象。因为 JsonObject 是可变的,持有对输入的引用将反射(reflect)变化。一个缺点是您不能以这种方式替换 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();      
}

关于java - 如何修改JSON数据并返回更新后的JSON数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29804576/

相关文章:

java - java8流下载文件的有效方法

ios - ios中如何解析多个json?

json - 使用jQuery获取json数据返回无效标签错误

javascript - SyntaxError : JSON. 解析:JavaScript 中 JSON 数据第 1 行第 92 列的 JSON 数据后出现意外的非空白字符

json - 将 IBM 移动应用程序构建器连接到 Cloudant JSON 数据 - bluemix-mobile-services

java - Hibernate 映射复合键 ManyToMany 导致 ClassCastException

java - Android - 如果我不导入 R 会出现错误,如果导入则会出现另一个错误?

java - 在多个标签中包含标签的 XML

java - 循环无法识别先前定义的变量

c# - JsonCovertor反序列化时自动选择参数化构造函数