Java 迭代遍历n个嵌套映射和列表
我有一个通用映射,它可以包含一个映射列表,可以迭代地包含另一个映射列表或另一个对象映射等 地图我的地图 我需要一种不知道映射结构的方法来更新嵌套值。例如,假设我的地图如下所示:Java 迭代遍历n个嵌套映射和列表,java,maps,Java,Maps,我有一个通用映射,它可以包含一个映射列表,可以迭代地包含另一个映射列表或另一个对象映射等 地图我的地图 我需要一种不知道映射结构的方法来更新嵌套值。例如,假设我的地图如下所示: {mymap : myList[{'myObject' : 'someValue'}, {'myObject' : 'someOtherValue'}]} 基于某种路径表达式,例如“mymap.myList.myObject”,我需要能够用新值替换所有“myObject”值 如何迭代遍历所有映射和列表以获得所需的值?这
{mymap : myList[{'myObject' : 'someValue'}, {'myObject' : 'someOtherValue'}]}
基于某种路径表达式,例如“mymap.myList.myObject”,我需要能够用新值替换所有“myObject”值
如何迭代遍历所有映射和列表以获得所需的值?这需要是通用的,以便映射的结构可以更改,并且我可以基于路径表达式进行迭代。可能是合适的。确保类路径上有以下两个依赖项:
com.jayway.jsonpath:json-path:2.2.0
com.fasterxml.jackson.core:jackson-databind:2.7.0
然后:
import java.util.*;
import com.jayway.jsonpath.JsonPath;
public class Sandbox {
private static class Widget {
private final String id;
public Widget(String id) {
this.id = id;
}
@Override
public String toString() {
return "Widget{id='" + id + "'}";
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Map map1 = new HashMap();
map1.put("myObject", new Widget("cog"));
Map map2 = new HashMap();
map2.put("myObject", new Widget("sprog"));
Map root = new HashMap();
root.put("myList", new ArrayList(Arrays.asList(map1, map2)));
root.put("myObject", new Widget("frobulator"));
System.out.println("BEFORE: " + root);
// set the value of all 'myObject' nodes no matter how deeply nested
JsonPath.parse(root).set("$..myObject", new Widget("novaDetonator"));
System.out.println("AFTER:" + root);
}
}
输出:
BEFORE: {myList=[{myObject=Widget{id='cog'}}, {myObject=Widget{id='sprog'}}], myObject=Widget{id='frobulator'}}
2016-05-16 13:44:44,337 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $..['myObject']
2016-05-16 13:44:44,343 [main] DEBUG com.jayway.jsonpath.internal.JsonContext - Set path $['myObject'] new value Widget{id='novaDetonator'}
2016-05-16 13:44:44,344 [main] DEBUG com.jayway.jsonpath.internal.JsonContext - Set path $['myList'][0]['myObject'] new value Widget{id='novaDetonator'}
2016-05-16 13:44:44,344 [main] DEBUG com.jayway.jsonpath.internal.JsonContext - Set path $['myList'][1]['myObject'] new value Widget{id='novaDetonator'}
AFTER:{myList=[{myObject=Widget{id='novaDetonator'}}, {myObject=Widget{id='novaDetonator'}}], myObject=Widget{id='novaDetonator'}}
当然,您的替换值可以是
字符串
,而不是小部件
;JsonPath可以使用这两种方法中的任何一种都很好。您想用新对象替换映射中的键吗?或者使用新对象?我想用新值替换某个键的值。因此,基于上述示例,我想用新值替换所有出现的“myObject”。