一.问题背景
最近在做项目时需要对某个接口返回的数据进行解析,在解析的过程中发现该json数据格式不是一般的格式,不是可以多次使用JSONObject.parse()方法或者JSONObject.fromObject()方法多次解析得到,具体情况如下:
二,JSON格式字符串形式如下,目的是要解析出adress等字段信息。
{
“data”:{
"msg":"success",
"code":"200",
"data":{
"count":1,
"pages":1,
"data":[
{
"username":"jaybillions",
"adress":"beijing",
"time":"20200626"
}
]
}
}
}
三.解决过程
1.看到这种数据,第一步很明显,将整个json字符串化为对象,然后使用如下语句即可进入下一层:
String dataOne = jsonObject.getString("data");//获取第一层data数据
JSONObject dataOneObj = JSONObject.fromObject(dataOne);
//重复上面的操作,一层一层取进去
String dataTwo = dataOneObj.getString("data");//解析到这里抛异常了
2.看到第二部抛异常就很奇怪,不就是json格式吗,上面都是这么取得,也没什么奇怪,但是我将“dataOneObj”对象打印出来
发现其实是一种map类型的字符串,显示为:
{msg=success,code=200,data={.....}}
3.将其强转为map,然后又进一步取出最内层data值,同样的,将最内层data数据打印出来后,发现是将多个map放入了list中,然后转成字符串的一种操作,显示结构如下:
[{ username=jaybillions, adress=beijing, time=20200626 }]
//如果map类型的有多个,应该是这样的,这种结构也无法使用最一般的方式来取
[{ username=jaybillions, adress=beijing, time=20200626 },{ username=jay, adress=shanghai, time=20200626 }]
4.取出address字段代码如下:
public String getAddress(JSONObject result){
String res = "";
//此处可以做一些判断是否返回体符合要求,是否有必要解析,此处略去
//直接开始解析Address
HashMap<String,Object> map = (HashMap<String,Object>)result.get("data");
for(Map.Entry<String,Object> entry : map.entrySet()){
if(entry.getKey().equals("data")){
HashMap<String,Object> value = (HashMap<String,Object>)entry.getValue();
//获取[{a=b,c=d},{e=f.g=h}]
List<?> lists = (ArrayList<?>)value.get("data");
//取第一个为例
HashMap<String,Object> useinfo = (HashMap<String,Object>)lists.get(0);
for(Map.Entry<String,Object> info: useinfo.entrySet()){
String entryEleKey = info.getKey();
if(entryEleKey.equals("address")){
Object valueObj = info.getValue();
res = valueObj.toString();
break;
}
}
}
}
}
本文介绍了在处理项目中遇到的一个特殊JSON格式数据的解析问题。该JSON数据内部包含多个Map类型的元素,存储在一个List中。解析过程中,首先将整个JSON字符串转化为对象,然后逐层深入,通过转换为Map并提取List来获取如address等字段信息。
713

被折叠的 条评论
为什么被折叠?



