【JAVA】复杂JSON处理思路

370 阅读2分钟

题记

将map所有子值拽出来放在一起。

解决思路是从网上找的,忘了哪里搬过来的了,进行了一定的修改,应该不算侵权吧...

先上JSON

就问作为一个后端处理这样的JSON是不是一种灾难?

{
    "Body":{
        "k1":{
            "k2":{
                "BSUCCESS":"Y",
                "MSG":"成功!",
                "LXINFOS":{
                    "LXINFO":{
                        "CLXCODE":"11111",
                        "CLXNAME":"111111",
                        "CDEPCODE":"111111",
                        "CDEPNAME":"111111111",
                        "CBUDGETTYPECODE":"1111111111",
                        "CSALETYPE":"111111111111"
                    }
                }
            }
        }
    }
}

正常思路我想拿到最里面的DATA,是不是得一层层的往下找

  1. 用jsonObject 有getArray和getObject的方法一层层的去拿(这个文章不再赘述)
  2. 先转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"
}