对将多个map类型数据放入list中的json格式数据进行解析

本文介绍了在处理项目中遇到的一个特殊JSON格式数据的解析问题。该JSON数据内部包含多个Map类型的元素,存储在一个List中。解析过程中,首先将整个JSON字符串转化为对象,然后逐层深入,通过转换为Map并提取List来获取如address等字段信息。

一.问题背景

        最近在做项目时需要对某个接口返回的数据进行解析,在解析的过程中发现该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;
            }

                    }
                                    }
                                                    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值