Как динамически обновить любое значение в строке JSON - PullRequest
0 голосов
/ 04 октября 2018

У меня есть требование, где мне нужно обновить значение в JSON.Путь ключа, который мне нужно обновить, также основан на некоторых условиях, поэтому я должен сохранить путь в файле свойств.Это мой JSON

String jsonString = "{\"delivery_codes\": [{\"postal_code\": {\"district\": \"District1\", \"pin\": 201001, \"pre_paid\": \"Y\", \"cash\": \"Y\", \"pickup\": \"Y\", \"repl\": \"N\", \"cod\": \"Y\", \"is_oda\": \"N\", \"sort_code\": \"GB\", \"state_code\": \"UP\"}}]}";

Теперь мое требование: Предположим, мне нужно обновить значение pre_paid до N, но мне нужно, чтобы путь pre_paid был динамически, потому что может случиться так, что когда-нибудь мне потребуется обновить state_code или sort_codeили pre_paid и т. д. Поэтому я использовал JSONPath:

String jsonPathExpressionForDistrict = "$['delivery_codes'][0]['postal_code']['district']";
String jsonPathExpressionForState_code = "$['delivery_codes'][0]['postal_code']['state_code']";

Эти пути мне нужно хранить в некоторых файлах свойств / БД.

Я могу прочитать свойство по следующему коду:

JsonPath.parse(jsonString).read(jsonPathExpressionForDistrict , JsonNode.class) -> This gives me value 'District1'

Но когда я пытаюсь обновить значение с помощью следующего кода:

JsonPath.parse(jsonString).put(jsonPathExpressionForDistrict , "District2", String.class);

Это даетошибка ниже:

Исключение в потоке "main" com.jayway.jsonpath.InvalidModificationException: можно добавлять только свойства карты на com.jayway.jsonpath.internal.PathRef $ ObjectPropertyPathRef.put (PathRef).java: 265) на com.jayway.jsonpath.JsonPath.put (JsonPath.java:304) на com.jayway.jsonpath.internal.JsonContext.put (JsonContext.java:221) на com.jayway.jsonpath.internal.JsonContext.put (JsonContext.java:199) по адресу com..service.ServiceImpl.main (ServiceImpl.java:179)

Кто-то, пожалуйста, сообщите мне об этом.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Когда вам нужно обновить значение уже существующего узла, вы должны использовать метод set.Я надеюсь, что нижеприведенное поможет:

String jsonString = "{\"delivery_codes\": [{\"postal_code\": {\"district\": \"District1\", \"pin\": 201001, \"pre_paid\": \"Y\", \"cash\": \"Y\", \"pickup\": \"Y\", \"repl\": \"N\", \"cod\": \"Y\", \"is_oda\": \"N\", \"sort_code\": \"GB\", \"state_code\": \"UP\"}}]}";

    String jsonPathExpressionForDistrict = "$['delivery_codes'][0]['postal_code']['district']";
    String jsonPathExpressionForState_code = "$['delivery_codes'][0]['postal_code']['state_code']";

    DocumentContext documentContext = JsonPath.parse(jsonString);
    System.out.println(documentContext.jsonString());

    String read = documentContext.read(jsonPathExpressionForDistrict);

    System.out.println(read);
    documentContext.set(jsonPathExpressionForState_code, "District2");

    System.out.println(documentContext.jsonString());
0 голосов
/ 04 октября 2018

Используйте библиотеку org.json.

Org.JSON

Вы можете взять JSONArray и получить ключи для элементов в массиве.

Вы можете получить элемент, подобный этому:

array.getJSONObject(i).getInt("postal_code");

В этом случае, я - элемент в JSONArray.

Удачи.

...