java 扁平化输出json所有节点keyvalue

mac2025-05-29  2

原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<String, Object> 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<String, Object> 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<String, Object> maps = new HashMap<>(); json2Map(jsonStr, maps); for (Map.Entry<String, Object> entry : maps.entrySet()) { System.out.println("\"" + entry.getKey() + "\":\"" + entry.getValue() + "\","); } } }

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

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

最新回复(0)