Обновить элемент внутреннего объекта в Json с помощью Gson - PullRequest
0 голосов
/ 17 февраля 2020

У меня ниже json и мне нужно обновить элементы, нижеприведенный код работает для элементов на верхнем уровне. Как я могу расширить это для работы внутри другого внутреннего уровня (объекта).

Json:

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

В приведенном ниже коде я передаю ниже

например. 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",
}

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Передайте keyPath как "reqParams / headerId", потому что headerId находится внутри reqParams и не на root уровне JSON.

0 голосов
/ 18 февраля 2020

Немного обновил код и передал параметры в соответствии с предложением ответа @Smile

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();

}

...