使用fastJson为工具,封装了一个方法,免去了根据数据结构层层解析的痛楚,本人比较菜,可能使用场景有限:
数据预处理:
1. 如果json最外层为数组,需要如下处理;
/**最外层为数组的预处理
* @param data
*/
@Test
public void arrayPre(String data){
JSONArray array = JSON.parseArray(data);
Map<String,Object> res = new HashMap<>();
for(int i = 0; i < array.size(); i++){
parseJson(res,JSON.parseObject(array.get(i).toString()));
}
}
2.如果外层为json对象:
/**最外层为json对象的预处理
* @param data
*/
@Test
public void jsonObj(String data){
JSONObject jsonObject = JSON.parseObject(data);
parseJson(new HashMap<String, Object>(),jsonObject);
}
下面是封装的解析方法(工具fastJson):
/**递归解析json: 传入json对象,和一个装结果的map,
* @param map json中所有的键值对,包括外层的
* @param jsonObject 适用所有jsonObject实现map的工具(把第二个参数换成Map<String,Object>即可),比如:fastJson
* @return
*/
public Map<String,Object> parseJson(Map<String,Object> map,JSONObject jsonObject){
for(Map.Entry<String,Object> entry : jsonObject.entrySet()){
map.put(entry.getKey(),entry.getValue());
if(entry.getValue().toString().contains("{")){
try {
JSONObject var1 = JSON.parseObject(entry.getValue().toString());
map = parseJson(map,var1);
}catch (ClassCastException e){
JSONArray array = JSON.parseArray(entry.getValue().toString());
for(int i = 0; i < array.size(); i++){
map = parseJson(map,JSON.parseObject(array.get(i).toString()));
}
}
}
}
return map;
}
下面是我解析的天气相关json的结果和源数据:
希望对你有所帮助! 一起踩坑,一起成长;
Java原生核心,不用带三方jar :
/**import net.sf.json.JSONArray;
* import net.sf.json.JSONException;
* import net.sf.json.JSONObject;
* import java.util.HashMap;
* import java.util.Iterator;
* import java.util.Map;
* @param res
* @param json
* @return
*/
private static Map<String,Object> parseJsonToMap(Map<String,Object> res, JSONObject json){
Iterator iterator = json.keys();
while (iterator.hasNext()){
String key = (String) iterator.next();
Object value = json.get(key);
res.put(key,value);
if(value.toString().contains("{")){
try {
JSONObject var = JSONObject.fromObject(value.toString());
res = parseJsonToMap(res, var);
}catch (JSONException e){
JSONArray array = JSONArray.fromObject(value);
for(int i = 0; i < array.size(); i++){
res = parseJsonToMap(res, (JSONObject) array.get(i));
}
}
}
}
return res;
}