Java - используйте jsonPath для обновления Json на основе текущего значения
Мне удалось обновить объект json, используя jsonPath с этим кодом
JSONObject json = new JSONObject("{\"data\":[{\"city\":\"New York\",\"name\":\"John\",\"age\":31},{\"city\":\"Paris\",\"name\":\"Jack\",\"age\":12}]}");
DocumentContext doc = JsonPath.parse(json.toString())
.set("$..name","newName");
System.out.println("doc.jsonString() = " + doc.jsonString());
выходы:
doc.jsonString() = {"data":[{"city":"New York","name":"newName","age":31},{"city":"Paris","name":"newName","age":12}]}
Теперь я хотел бы обновить значение в зависимости от старого значения (применяя функцию к старому значению)
Что-то вроде
DocumentContext doc = JsonPath.parse(json.toString())
.set("$..name",upper(oldValue))
.set("$..age", oldValue+10);
Это привело бы к следующему JSON
doc.jsonString() = doc.jsonString() = {"data":[{"city":"New York","name":"JOHN","age":41},{"city":"Paris","name":"JACK","age":22}]}
Кто-нибудь знает, как мне удается ссылаться на старое значение, как это?
С Уважением,
2 ответа
Вы можете использовать функцию карты класса DocumentContext, как в примере ниже:
DocumentContext json = JsonPath.using(configuration).parse(jsonStr);
DocumentContext result = json.map("$..name", (currentValue, configuration) -> {
return currentValue.toString().toUpperCase();
});
System.out.println(result.jsonString());
В этом примере значение меняется на верхний регистр.
Попробуйте проверить это в документации класса Jsonpath DocumentContext.
Вы можете использовать функции разбора и установки JsonPath.
пример:
public static String replaceOldValueVithNewValueforGivenPath(String jsonBody, String path, String newValue)
{
// validateJsonInput(jsonBody);
try {
return JsonPath.parse(jsonBody).set(path,newValue).jsonString();
} catch (PathNotFoundException var3) {
throw new RuntimeException("No results for path: " + path);
}
}