json字符串转为map结构,复杂json字符串转为map结构

json转map通用方法

开发的时候,经常会遇到json转为Map的需求,简单的json还好处理,如果json比较复杂,转换后为Map嵌套结构,就比较难处理。比如:将下面的json字符串转为Map接口:

 

{
"data": [
           {
            "IR_SRCNAME": "车主之家",
                "IR_SITENAME": "车主之家",
                "IR_AUTHORS": null,
                "IR_URLTITLE": "2017年4月份高尔夫销量11798台, 同比下降20.24%",
                "IR_URLNAME": "http://news.16888.com/a/2017/0521/8172148.html",
                "IR_ABSTRACT": " 2017年4月份高尔夫销量11798台 ",
                "IR_URLTIME": "2017/05/21 23:35:00",
                "IR_HKEYBBSNUM": "18093721078864168420-0",
                "IR_CHANNEL": "新闻_汽车新闻", 
                "COMPANY_RISK_CONN": "汽车之家股份有限公司_财务风险\偿债能力\营运资本_18;",
                "ZFM": "负面"
           }
    	],
        "path": "/cloud/wsu/queryByKeyword!get_by_fullname.action",
                "rstcode": "0000",
                "rstcount": 19476,
                "cmpname": "汽车之家股份有限公司",
                "shortname": "汽车之家",
                "rstmsg": "查询成功"
}

 

 

 

看完发现,这个json字符串转为map后,应该是Map嵌套Map结构的。怎么办呢?

这里提供一方法,可以当作工具类,只要json字符串没有问题,嵌套几层都可以。

import net.sf.json.JSONArray;
import net.sf.json.JSONObject
public class Json2Map {

    /**
     * 将json字符串转为Map结构
     * 如果json复杂,结果可能是map嵌套map
     * @param jsonStr 入参,json格式字符串
     * @return 返回一个map
     */
    public static Map<String, Object> json2Map(String jsonStr) {
        Map<String, Object> map = new HashMap<>();
        if(jsonStr != null && !"".equals(jsonStr)){
            //最外层解析
            JSONObject json = JSONObject.fromObject(jsonStr);
            for (Object k : json.keySet()) {
                Object v = json.get(k);
                //如果内层还是数组的话,继续解析
                if (v instanceof JSONArray) {
                    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
                    Iterator<JSONObject> it = ((JSONArray) v).iterator();
                    while (it.hasNext()) {
                        JSONObject json2 = it.next();
                        list.add(json2Map(json2.toString()));
                    }
                    map.put(k.toString(), list);
                } else {
                    map.put(k.toString(), v);
                }
            }
            return map;
        }else{
            return null;
        }
    }
}

 

 

用上面这个方法处理完后,打印这个map,结果如下:

 

 

{rstcount=19476, path=/cloud/wsu/queryByKeyword!get_by_fullname.action, 
data=[{ZFM=负面, COMPANY_RISK_CONN=汽车之家股份有限公司_财务风险偿债能力营运资本_18;, IR_URLTIME=2017/05/21 23:35:00, IR_URLTITLE=2017年4月份高尔夫销量11798台, 同比下降20.24%, IR_SRCNAME=车主之家, IR_SITENAME=车主之家, IR_URLNAME=http://news.16888.com/a/2017/0521/8172148.html, IR_ABSTRACT= 2017年4月份高尔夫销量11798台 , IR_HKEYBBSNUM=18093721078864168420-0, IR_AUTHORS=null, IR_CHANNEL=新闻_汽车新闻}], 
rstcode=0000, 
cmpname=汽车之家股份有限公司, 
shortname=汽车之家, 
rstmsg=查询成功}

 

可以看到结果是一个Map嵌套一个Map。可以把这个方法存起来,遇到json转Map时,直接使用就好了。

 

 

注意:这里的json字符串中很多双引号,用eclipse开发,可能会涉及转义问题,但是idea就不用,把这个json传扔到idea里,直接就转义了这些双引号,如下:

 

String jsonp = "{\n" +
                    "\"data\": [\n" +
                    "        {\n" +
                    "            \"IR_SRCNAME\": \"车主之家\",\n" +
                    "                \"IR_SITENAME\": \"车主之家\",\n" +
                    "                \"IR_AUTHORS\": null,\n" +
                    "                \"IR_URLTITLE\": \"2017年4月份高尔夫销量11798台, 同比下降20.24%\",\n" +
                    "                \"IR_URLNAME\": \"http://news.16888.com/a/2017/0521/8172148.html\",\n" +
                    "                \"IR_ABSTRACT\": \" 2017年4月份高尔夫销量11798台 \",\n" +
                    "                \"IR_URLTIME\": \"2017/05/21 23:35:00\",\n" +
                    "                \"IR_HKEYBBSNUM\": \"18093721078864168420-0\",\n" +
                    "                \"IR_CHANNEL\": \"新闻_汽车新闻\", \n" +
                    "                \"COMPANY_RISK_CONN\": \"汽车之家股份有限公司_财务风险\\偿债能力\\营运资本_18;\",\n" +
                    "                \"ZFM\": \"负面\"\n" +
                    "        }\n" +
                    "    ],\n" +
                    "        \"path\": \"/cloud/wsu/queryByKeyword!get_by_fullname.action\",\n" +
                    "                \"rstcode\": \"0000\",\n" +
                    "                \"rstcount\": 19476,\n" +
                    "                \"cmpname\": \"汽车之家股份有限公司\",\n" +
                    "                \"shortname\": \"汽车之家\",\n" +
                    "                \"rstmsg\": \"查询成功\"\n" +
                    "    }\n";

上面代码直接复制使用就好,不用额外处理。
 

依赖为参考:net.sf.json.JSONObject maven依赖

 

 

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值