在使用JsonPath 库的同时,我正在努力修改几个JSON对象。
我有一个选择器,该选择器在运行时声明,并且包含一个未知大小的JSON文件。
我只想修改与选择器定义的过滤条件匹配的JSON对象。
在此示例中,所有对象都获得一个新密钥:joinedName = firstName + ‘ ‘ + lastName
(鲍勃的对象除外)。
我确实可以使用它,但是我有一种感觉,应该有一种更好的方法。
请让我知道如何改善我的解决方法。
谢谢!
@Test
public void addMultipleValuesAtOnce() throws JSONException {
String json = "{\n" +
"\"jsonArr\": [\n" +
" {\n" +
" \"firstName\":\"Alice\",\n" +
" \"lastName\":\"Smith\"\n" +
" },\n" +
" {\n" +
" \"firstName\":\"Bob\",\n" +
" \"lastName\":\"Williams\"\n" +
" },\n" +
" {\n" +
" \"firstName\":\"Carol\",\n" +
" \"lastName\":\"Johnson\"\n" +
" }\n" +
" ]\n" +
"}";
System.out.println("------------- IN --------------");
System.out.println(json);
DocumentContext parse = JsonPath.parse(json);
final String selector = "$.jsonArr[?(!(@.firstName == 'Bob'))]"; // select every entry, except BOB's
net.minidev.json.JSONArray firstNames = parse.read(selector + ".firstName");
net.minidev.json.JSONArray lastNames = parse.read(selector + ".lastName");
//HACK
{
String[] joinedNames = new String[firstNames.toArray().length];
for (int i = 0; i < joinedNames.length; i++) {
joinedNames[i] = firstNames.get(i) + " " + lastNames.get(i);
}
parse.put(selector, "joinedName", null); // add key
final AtomicReference<Integer> counter = new AtomicReference<>(0);
parse.map(selector + ".joinedName", (o, configuration) -> {
return joinedNames[counter.getAndUpdate(x -> x + 1)];
});
}
System.out.println("------------- OUT --------------");
System.out.println(parse.jsonString());
// The expected values:
Assert.assertEquals("Alice Smith", parse.read("$.jsonArr[0].joinedName"));
Assert.assertEquals("Carol Johnson", parse.read("$.jsonArr[2].joinedName"));
}