json字符串转为map结构,复杂json字符串转为map结构_IT云清-程序员宝宝

技术标签: java  json  (1)...java  (6)...开发  

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依赖

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39800144/article/details/77871115

智能推荐

我读 《国富论》 - 亚当 · 斯密 / 论增进劳动生产力的因素,以及劳动生产物在各个阶层中自然分配的顺序_简简单单OnlineZuozuo的博客-程序员宝宝

文章目录我读 《国富论》 - 亚当 · 斯密 / 论增进劳动生产力的因素,以及劳动生产物在各个阶层中自然分配的顺序1、论工资2、国家工资3、对婚姻影响我读 《国富论》 - 亚当 · 斯密 / 论增进劳动生产力的因素,以及劳动生产物在各个阶层中自然分配的顺序1、论工资分工引发的各种改良会促使劳动生产力提高,劳动工资也会随之增长。可是所有的生产物品却呈现越来越廉价的趋势,原因就在于,他们所需要付出的劳动少了。各种商品是在劳动等量的情况下进行彼此交换的。无论在哪里, 对劳动者的普通工资起决定作用的都是

互联网日报 | 理想汽车登陆纳斯达克;苏宁易购会员数量突破6亿;高德地图上线“司机公厕”..._liudada8265的博客-程序员宝宝

今日看点✦理想汽车正式在纳斯达克挂牌上市,股价开盘大涨35%✦ 苏宁易购上半年实现营收1182.43亿元,会员数量突破6亿✦ 高德地图上线北京92处可临时停车公厕,车辆可临停15分钟✦...

SCI投稿前需要准备哪些材料?_EA-ISET学术的博客-程序员宝宝

今天EA-ISET协会给大家分享一篇关于SCI投稿知识的文章。好不容易写好文章,看准了一个杂志,撸起袖子准备投稿时,突然发现除了需要上传初稿附件外,必须上传一些其他附件,以及要求论文中必须在参考文献前附上一些利益等声明条款;比如:★常见附件材料:Cover Letter, Highlights, Reviewer suggestions,Checklist,Graphic Abstract等;★常见附在参考文献前的声明条款:Availability of data and material;

JDK、JRE、JVM和javac的关系_24只羊羊羊的博客-程序员宝宝_javac在jdk还是jre中

    .java为Java的源文件后缀,编写的代码需要写在.java文件中。    Javac编译器,用于读取Java源代码,并将其编译成字节代码。经过javac编译后形成.class,是字节码文件。    Java虚拟机(JVM)运行.class文件从而实现程序的运行。    1、JVM——java virtual machine,就是我们常说的java虚拟机,它是整个java实现...

Unsupervised Feature Learning via Non-Parametric Instance Discrimination_ML_NI_CSU的博客-程序员宝宝

论文地址:Unsupervised Feature Learning via Non-Parametric Instance Discriminationgithub代码:NCE代码摘要:在有标签数据上训练的神经网络分类器能够很好的捕捉图片间的视觉相似性。文章假设:我们能通过训练基于实例(将每一个样本视为单独的类别)的分类器代替基于类别的分类器,得到可以捕捉视觉相似性的特征表达。我们将其总结...

JavaScript忍者秘籍--学习笔记_waterwatermelon的博客-程序员宝宝

chapter 3 函数函数都一个name属性表示函数的名字。命名函数和匿名函数的区别?变量提升 声明(var)会被提升,初始化不会被提升。函数的作用域是指声明该函数的整个函数范围。arguments 参数–类数组this参数依赖函数调用的方式。调用上下文(invocation context)构造器的超能力1.创建一个新的空对象2.传递给构造器的对象是this参数(即刚刚创建的...

随便推点

flashback database 方法_congxinlan3332的博客-程序员宝宝

SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jan 23 23:30:17 2010Copyright (c) 1982, 2007, Oracle. All...

mozjpeg:JPEG图片压缩5%,获Facebook支持_weixin_33889665的博客-程序员宝宝

mozjpeg是一个来自Mozilla实验室的JPEG图像编码器项目,目标是在不降低图像质量且兼容主流的解码器的情况下,提供产品级的JPEG格式编码器来提高压缩率以减小JPEG文件的大小。Mozilla指出,这些年来,网站的图片使用数量和大小都在与日俱增,而HTML、JS和CSS文件大小都相对减小了。也就是说在页面加载的过程中,图片占用了大量的网络流量...

uboot-2015-07的start.S的文件启动过程_shenlong1356的博客-程序员宝宝

https://blog.csdn.net/u013904227/article/details/51648179https://www.cnblogs.com/debruyne/p/9208809.htmlhttps://blog.csdn.net/weixin_41734376/article/details/98586549

数据结构之通用树结构的实现_顾小豆的博客-程序员宝宝_树结构实现

之前我们讲了树的定义和操作,这节我们讲一下如何实现这些操作。既然要考虑如何实现,那就得说说树的存储结构。大家都知道树是非线性数据结构,显然我们无法用数组来表示树的逻辑结构。那我们应该怎么办呢?通过什么来表示呢?其实可以设计结构体数组对结点间的关系进行表述。如下图所示:从上图发现,将根结点的双亲定义为-1,表示其没有双亲;将根的孩子结点的双亲定义为0,表示其双亲是根结点;将根结点孩子1的孩子结点的双...

时间序列预测方法汇总:从理论到实践(附Kaggle经典比赛方案)_PaperWeekly的博客-程序员宝宝

作者 | Light学校 | 中国科学院大学研究方向 | 机器学习时间序列是我最喜欢研究的一种问题,这里我列一下时间序列最常用的方法,包括理论和实践两部分。理论部分大多是各路神仙原创的高...

windbg命令_ken_scott的博客-程序员宝宝

windbg命令linux下使用ulimit -S -c unlimited命令,可以使程序崩溃时生成core文件,使用gdb exec_file core_file就可以查看崩溃的程序,接着使用bt就基本可以定位触发崩溃的代码段windows下没有这么方便,但可以使用procexp和windbg来达到相同的目的,程序崩溃后,可以打开procexp,然后在procexp中选择崩溃的程序,右