java 扁平化输出json所有节点key/value

原JSON文本:

{
	"name": "哈利·波特",
	"sex": 1,
	"birthday": "2014-12-12",
	"desc": "巫师夫妇詹姆·波特和莉莉·波特的独生子",
	"school": {
		"schChName": "霍格沃茨魔法学校",
		"schEnName": "Hogwarts School of Witchcraft and Wizardry",
		"schCreateTime": "990年前后"
	},
	"friends": [{
		"aName": "赫敏·格兰杰",
		"aSex": 2,
		"aAddress": "出身一个麻瓜家庭"
	}, {
		"bName": "罗恩·韦斯莱",
		"bSex": 1,
		"bAddress": "哈利在霍格沃茨最要好的朋友"
	}]
}

需求文本:

{
    "birthday":"2014-12-12",
    "schCreateTime":"990年前后",
    "bName":"罗恩·韦斯莱",
    "schChName":"霍格沃茨魔法学校",
    "schEnName":"Hogwarts School of Witchcraft and Wizardry",
    "sex":"1",
    "aSex":"2",
    "bSex":"1",
    "friends":[{"aAddress":"出身一个麻瓜家庭","aName":"赫敏·格兰杰","aSex":2},{"bAddress":"哈利在霍格沃茨最要好的朋友","bName":"罗恩·韦斯莱","bSex":1}],
    "aAddress":"出身一个麻瓜家庭",
    "bAddress":"哈利在霍格沃茨最要好的朋友",
    "school":{"schCreateTime":"990年前后","schChName":"霍格沃茨魔法学校","schEnName":"Hogwarts School of Witchcraft and Wizardry"},
    "aName":"赫敏·格兰杰",
    "name":"哈利·波特",
    "desc":"巫师夫妇詹姆·波特和莉莉·波特的独生子"
}

Json2MapUtils.java

package XX.XX.XX.XX.XX.XX;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;

import java.util.*;
import java.util.logging.Logger;

/**
 * @Author:zwp
 * @Description:把json对象数据存储在map以键值对的形式存储,只存储叶节点
 * @Date:2019-11-01
 */
class Json2MapUtils {

    private static Logger log = Logger.getLogger("XX.XX.XX.XX.XX.XX.Json2MapUtils");

    private static final Integer JSON_TYPE_OBJECT = 1;
    private static final Integer JSON_TYPE_ARRAY = 2;
    private static final Integer JSON_TYPE_ERROR = 3;

    /**
     * 获取json字符串的格式
     *
     * @param jsonStr 需要处理的json字符串
     * @return json格式
     */
    private static Integer getJsonType(String jsonStr) {
        try {
            JSONObject.parseArray(jsonStr);
            return JSON_TYPE_ARRAY;
        } catch (Exception e1) {
            try {
                JSONObject.parseObject(jsonStr);
                return JSON_TYPE_OBJECT;
            } catch (Exception e2) {
                return JSON_TYPE_ERROR;
            }
        }
    }

    /**
     * 判断json内容是否需要进一步操作
     *
     * @param resultMap 结果集
     * @param o         json内容
     */
    private static void reduceJson(Map resultMap, Object o) {
        if (null != o && !"".equals(o.toString().trim())) { // 排除null/空值
            if (o instanceof JSONObject || o instanceof JSONArray) { // 排除非 json 对象/数组
                json2Map(o.toString(), resultMap);
            }
        }
    }

    /**
     * 核心转换函数
     *
     * @param jsonStr   需要处理的json字符串
     * @param resultMap 结果集
     */
    public static void json2Map(String jsonStr, Map resultMap) {
        if (StringUtils.isEmpty(jsonStr)) {
            log.warning("jsonStr文本值为空");
            return;
        }
        Integer jsonType = getJsonType(jsonStr);

        if (JSON_TYPE_OBJECT.equals(jsonType)) {
            log.info("json对象:" + jsonStr);
            JSONObject json = JSONObject.parseObject(jsonStr);

            if (!json.isEmpty()) { // 排除空对象
                for (String k : json.keySet()) {
                    Object v = json.get(k);
                    resultMap.put(k, v);
                    reduceJson(resultMap, v);
                }
            }
        } else if (JSON_TYPE_ARRAY.equals(jsonType)) {
            log.info("json数组:" + jsonStr);
            JSONArray json = JSONObject.parseArray(jsonStr);
            if (json.size() > 0) { // 排除空数组
                for (Object o : json) {
                    reduceJson(resultMap, o);
                }
            }
        } else {
            log.warning("非json格式:" + jsonStr);
        }
    }

    public static void main(String[] args) {
        String jsonStr = "{\"name\":\"哈利·波特\",\"sex\":1,\"birthday\":\"2014-12-12\",\"desc\":\"巫师夫妇詹姆·波特和莉莉·波特的独生子\",\"school\":{\"schChName\":\"霍格沃茨魔法学校\",\"schEnName\":\"Hogwarts School of Witchcraft and Wizardry\",\"schCreateTime\":\"990年前后\"},\"friends\":[{\"aName\":\"赫敏·格兰杰\",\"aSex\":2,\"aAddress\":\"出身一个麻瓜家庭\"},{\"bName\":\"罗恩·韦斯莱\",\"bSex\":1,\"bAddress\":\"哈利在霍格沃茨最要好的朋友\"}]}";
        Map maps = new HashMap<>();
        json2Map(jsonStr, maps);
        for (Map.Entry entry : maps.entrySet()) {
            System.out.println("\"" + entry.getKey() + "\":\"" + entry.getValue() + "\",");
        }
    }
}

PS:本来这种转换需求在js中是很简单的,但是放在java中就有点烦恼了,也是暗示自我需要加强java基础知识的学习了,特此记录。

参考文章:https://www.cnblogs.com/jiangds/p/9204789.html

你可能感兴趣的:(java)