声明:
由于层级的json对象中名字可能会有重复,所有扁平化时key值带上了父级的key
使用一个key的list列表,来判断是否有重复的键插入,如果键已经存在,则跳过。
如果对于每个字段的信息都不可或缺,可以再判断有重复键的时候,修改键值名称,就能正常获取插入值了。
/**
* 递归对jsonNode进行处理
* @param map 要返回的表单对象
* @param parentPath 父path
* @param parentJsonNode 父节点对象
*/
private void setNodePath(Map<String, Object> map, String parentPath, JsonNode parentJsonNode) {
Iterator<String> sIterator = parentJsonNode.fieldNames();
while(sIterator.hasNext()) {
String key = sIterator.next();
JsonNode jsonNode = parentJsonNode.get(key);
if(jsonNode.isArray()) {
for (int i = 0; i < jsonNode.size(); i++) {
if (null != jsonNode.get(0)) {
Iterator<String> grid = jsonNode.get(0).fieldNames();
while(grid.hasNext()) {
String child = grid.next();
JsonNode jn = jsonNode.get(0).get(child);
String mapKey = key + "." + child;
if (jn.isDouble()) {
if (map.containsKey(mapKey)) {
map.put(mapKey, (Double)(map.get(mapKey)) + jn.asDouble());
} else {
map.put(mapKey, jn.asDouble());
}
} else if (jn.isFloat()) {
if (map.containsKey(mapKey)) {
map.put(mapKey, (Float)(map.get(mapKey)) + jn.asDouble());
} else {
map.put(mapKey, jn.asDouble());
}
} else if (jn.isInt()) {
if (map.containsKey(mapKey)) {
map.put(mapKey, (Integer)(map.get(mapKey)) + jn.asInt());
} else {
map.put(mapKey, jn.asInt());
}
} else {
if (map.containsKey(mapKey)) {
map.put(mapKey, (String)(map.get(mapKey)) + "," + jn.asText());
} else {
map.put(mapKey, jn.asText());
}
}
}
}
}
map.put(key, jsonNode.toString());
}
else if(jsonNode.isValueNode()) {
map.put(parentPath + "." + key, jsonNode.asText());
}
else if(jsonNode.isObject()) {
setNodePath(map, parentPath + "." + key, jsonNode);
}
}
}