题记
将map所有子值拽出来放在一起。
解决思路是从网上找的,忘了哪里搬过来的了,进行了一定的修改,应该不算侵权吧...
先上JSON
就问作为一个后端处理这样的JSON是不是一种灾难?
{
"Body":{
"k1":{
"k2":{
"BSUCCESS":"Y",
"MSG":"成功!",
"LXINFOS":{
"LXINFO":{
"CLXCODE":"11111",
"CLXNAME":"111111",
"CDEPCODE":"111111",
"CDEPNAME":"111111111",
"CBUDGETTYPECODE":"1111111111",
"CSALETYPE":"111111111111"
}
}
}
}
}
}
正常思路我想拿到最里面的DATA,是不是得一层层的往下找
- 用jsonObject 有getArray和getObject的方法一层层的去拿(这个文章不再赘述)
- 先转map拿body,再转map拿k1,再转map拿k2·····以此往复,是不是很有规律性?
是的,我找到的办法就是第二种办法的简洁版
map扁平化处理
这个词啊,是我在网上找的时候看到的,反正就是循环把map的值全部拿出来,放到一个大map中。
原方法
会保留所有的值,key是累加起来的
private static final String SEPARATOR = "_";
/**
* 深度嵌套map对象转大map(扁平化)
* @param source 源map
* @param parentNode 父节点扁平化之后的名字
* @return map
*/
public static Map<String, Object> flat(Map<String, Object> source, String parentNode) {
Map<String, Object> flat = new HashMap<>();
Set<Map.Entry<String, Object>> set = source.entrySet();
String prefix = StringUtils.isNotBlank(parentNode) ? parentNode + SEPARATOR : "";
set.forEach(entity -> {
Object value = entity.getValue();
String key = entity.getKey();
String newKey = prefix + key;
if (value instanceof Map) {
flat.putAll(flat((Map)value, newKey));
} else {
flat.put(newKey, value);
}
});
return flat;
}
这样虽然能保留所有的值,但是使用起来终归是不方便,还得拼中间所有层级的key
{
"Body_Body_k1_k2_MSG":"成功!",
"Body_Body_k1_k2_LXINFOS_LXINFO_CDEPCODE":"111111111",
"Body_Body_k1_k2_LXINFOS_LXINFO_CDEPNAME":"111111111",
"Body_Body_k1_k2_LXINFOS_LXINFO_CLXNAME":"111111111",
"Body_Body_k1_k2_LXINFOS_LXINFO_CSALETYPE":"111111111",
"Body_Body_k1_k2_LXINFOS_LXINFO_CLXCODE":"111111111",
"Body_Body_k1_k2_LXINFOS_LXINFO_CBUDGETTYPECODE":"111111111",
"Body_Body_k1_k2_BSUCCESS":"Y"
}
我修改后
这样会只保留最底层的值,因为我的使用场景这样就足够了
public static Map<String, Object> flat(Map<String, Object> source, String parentNode) {
Map<String, Object> flat = new HashMap<>();
Set<Map.Entry<String, Object>> set = source.entrySet();
set.forEach(entity -> {
Object value = entity.getValue();
String key = entity.getKey();
if (value instanceof Map) {
flat.putAll(flat((Map)value, key));
} else {
flat.put(key, value);
}
});
return flat;
}
转完是这样的效果
{
"MSG":"成功!",
"CDEPCODE":"1111111",
"CLXNAME":"11111111111111",
"CLXCODE":"1111111",
"CDEPNAME":"1111111",
"CSALETYPE":"1111111",
"CBUDGETTYPECODE":"1111111",
"BSUCCESS":"1111111"
}