原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