我有一个需要在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)
请有人指导我。
答案 0 :(得分:1)
我知道已经晚了,但这也许可以帮助其他人。
OP收到该错误,因为值jsonPathExpressionForDistrict
是属性的路径,而不是JSON对象或映射。
要将district2
添加到postal_code
,路径应为"$['delivery_codes'][0]['postal_code']"
。
要使用JSonPath更新/添加JSON中的任何值,我们可以使用本文中提到的方法,但是需要检查并使该路径在源JSON对象中有效。
答案 1 :(得分:0)
使用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());