Java 8 使用Gson更新Json中的内部对象元素

Java 8 使用Gson更新Json中的内部对象元素,java-8,gson,Java 8,Gson,我有下面的json,需要更新元素,下面的代码适用于顶级元素,我如何扩展它以在另一个内部级别(对象)中使用它 Json: 在下面的代码中,我在下面传递 例如。 keyPath=“headerId” updateText=“123456” jsonText=在json之上 代码: public String updateValue(String keyPath, String updateText, String jsonText) { String[] keys = keyPath.spl

我有下面的json,需要更新元素,下面的代码适用于顶级元素,我如何扩展它以在另一个内部级别(对象)中使用它

Json:

在下面的代码中,我在下面传递

例如。 keyPath=“headerId” updateText=“123456” jsonText=在json之上

代码:

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) != null && jsonObject.get(key).isJsonObject())
        {
            jsonObject = (JsonObject)jsonObject.get(key);
        }
    }
    jsonObject.remove(finalKey);
    jsonObject.add(finalKey, jp);
    return returnVal.toString();
}

预期输出json:

{
  "name": George,
  "version": "2.0",
  "reqParams": {
    "headerId": "123456",
    "queue": "draft",
  }
}
实际雷诺数:

{
  "name": George,
  "version": "2.0",
  "reqParams": {
    "headerId": "this needs to be updated",
    "queue": "draft",
  },
  "headerId": "123456",
}

keyPath
作为“reqParams/headerId”传递,因为
headerId
位于
reqParams
内部,而不在JSON的根级别。

稍微更新了代码,并按照@Smile answer建议传递参数

keyPath : reqParams/headerId
          someId (if exist in root level)
代码:

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) != null && jsonObject.get(key).isJsonObject()) {
        jsonObject = (JsonObject) jsonObject.get(key);
        jsonObject.remove(finalKey);
        jsonObject.add(finalKey, jp);
        return returnVal.toString();
    } else if (jsonObject.get(finalKey) == null) {
        return returnVal.toString();
    }
}

jsonObject.remove(finalKey);
jsonObject.add(finalKey, jp);
return returnVal.toString();

}

能否显示当前输出?是否有方法遍历所有子对象并进行更新。因为一些有效负载是在根级别。否则,需要基于每个有效负载对密钥路径进行硬内核处理。有时“headerId”可以在根级别和子对象级别检查这个对deep-traverse-json的回答,并根据键调整代码以更新值。
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) != null && jsonObject.get(key).isJsonObject()) {
        jsonObject = (JsonObject) jsonObject.get(key);
        jsonObject.remove(finalKey);
        jsonObject.add(finalKey, jp);
        return returnVal.toString();
    } else if (jsonObject.get(finalKey) == null) {
        return returnVal.toString();
    }
}

jsonObject.remove(finalKey);
jsonObject.add(finalKey, jp);
return returnVal.toString();