如何在JSON字符串中动态更新任何值

时间:2018-10-04 11:21:53

标签: java json string jsonpath jsonparser

我有一个需要在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']";

这些路径我需要存储在某些属性文件/ DB中。

我可以通过以下代码读取属性:

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

但是当我尝试使用以下代码更新值时:

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

这给了我下面的错误:

  

线程“主”中的异常   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)

请有人指导我。

3 个答案:

答案 0 :(得分:1)

我知道已经晚了,但这也许可以帮助其他人。 OP收到该错误,因为值jsonPathExpressionForDistrict是属性的路径,而不是JSON对象或映射。

要将district2添加到postal_code,路径应为"$['delivery_codes'][0]['postal_code']"

要使用JSonPath更新/添加JSON中的任何值,我们可以使用本文中提到的方法,但是需要检查并使该路径在源JSON对象中有效。

答案 1 :(得分:0)

使用org.json库。

Org.JSON

您可以使用JSONArray并获取数组中Items的键。

您可以获得这样的物品:

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

在这种情况下,我是JSONArray中的项目。

祝你好运。

答案 2 :(得分:0)

当需要更新已经存在的节点的值时,应使用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());