取一个已转换为 的 JSON Map<String, Object>
:
{
"key1": "value1",
"key2": {
"nestedKey1": "nested value",
"nestedKey2": {
"nestedKey1": "nested value"
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中Object
value 可以是某种原始类型或嵌套的Map<String, Object>
. 我的目标是获得一张平面地图:
{
"key1": "value1",
"key2.nestedKey1": "nested value",
"key2.nestedKey2.nestedKey1": "nested value"
}
Run Code Online (Sandbox Code Playgroud)
如何?任何已经这样做的图书馆?
是的,您也可以在 Java8 中做到这一点。
主要测试方法:
Map<String, Object> in = new HashMap<>();
in.put("key1", "val1");
Map<String, Object> lvl1 = new HashMap<>();
lvl1.put("key2", "val2");
lvl1.put("key3", Collections.singletonMap("k3", "v3"));
in.put("key2", lvl1);
Map<String, Object> out = flatten(in);
Run Code Online (Sandbox Code Playgroud)
变压器方法:
private Map<String, Object> flatten(Map<String, Object> in) {
return in.entrySet().stream()
.flatMap(entry -> flatten(entry).entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue));
}
private Map<String, Object> flatten(Map.Entry<String, Object> in) {
// for other then Map objects return them
if (!Map.class.isInstance(in.getValue())) {
return Collections.singletonMap(in.getKey(), in.getValue());
}
// extract the key prefix for nested objects
String prefix = in.getKey();
Map<String, Object> values = (Map<String, Object>) in.getValue();
// create a new Map, with prefix added to each key
Map<String, Object> flattenMap = new HashMap<>();
values.keySet().forEach(key -> {
// use a dot as a joining char
flattenMap.put(prefix + "." + key, values.get(key));
});
// use recursion to flatten the structure deeper
return flatten(flattenMap);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1380 次 |
最近记录: |