Java中JSONObject与JSONArray的使用示例小结

 更新时间:2025年04月30日 10:12:43   作者:风的形状  
JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包,本文给大家介绍Java中JSONObject与JSONArray的使用示例小结,感兴趣的朋友一起看看吧

JSONObject与JSONArray

最近在学习过程中用到了稍微复杂点的json数据需要将json数据解析出来,这里就截取一部分作为例子

1.JSONObject介绍

JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包。

2.下载jar包

https://files.cnblogs.com/java-pan/lib.rar

*或者在Maven的pom.xml文件中直接配置如下:

<dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
</dependency>

 json数据:

{
    "cartypes":[
        {"id":1,"imgUrl":"img/l.jpg","bigimg": "img/d.jpg","title":"别克威朗","marketprice":"15.29","periods":"12",
           "endrepayone":"96800","endrepaytwo":"96800","endrepaythree":"93000",
           "endmonthone":"3408","endmonthtwo":"3408","endmonththree":"3278",
           "repayfirst":"15290","repaytwo":"22935", "repaythree":"30580",
           "monthrepayone":"3578","monthrepaytwo":"2878","monthrepaythree":"2478",
           "cardetails": 
           [{ 
             "imageId00": "img/first-bkwl.jpg",
             "imageId01": "img/bkwl01.jpg",
             "imageId02": "img/bkwl02.jpg",
             "imageId03": "img/bkwl03.jpg",
             "imageId04": "img/bkwl04.jpg",
             "carname": "别克",
             "carmatter": "威朗",
             "carvolume":"1.5L",
             "sitnum":"5",
             "cargearbox":"6挡手自一体",
             "caremission":"国V",
             "carldone":"一体式座舱",
             "carldtwo":"绒面内饰",
             "carldthree":"全景天窗",
             "carldfour":"展翼型HID大灯"
           }]
         },
         {"id":2,"imgUrl":"img/l.jpg","bigimg": "img/d.jpg","title":"英菲尼迪","marketprice":"18.98","periods":"12",
           "endrepayone":"126800","endrepaytwo":"126800","endrepaythree":"126800",
           "endmonthone":"4458","endmonthtwo":"4458","endmonththree":"4458",
           "repayfirst":"18980","repaytwo":"28470", "repaythree":"37960",
           "monthrepayone":"2738","monthrepaytwo":"1878","monthrepaythree":"998",
           "cardetails": 
            [{
             "imageId00": "img/first.jpg",
             "imageId01": "img/yfnd01.jpg",
             "imageId02": "img/yfnd02.jpg",
             "imageId03": "img/yfnd03.jpg",
             "imageId04": "img/yfnd04.jpg",
             "carname": "英菲尼迪",
             "carmatter": "ESQ",
             "carvolume":"1.6L",
             "sitnum":"5",
             "cargearbox":"CVT无级变速",
             "caremission":"国V",
             "carldone":"定制轮毂",
             "carldtwo":"多功能方向盘",
             "carldthree":"LED尾灯",
             "carldfour":"真皮座椅"
           }]
         }
    ]
}

当接受到的是上面的json数据时,要获取到里面的键对应的值应该怎样做呢,比如要获取title的值,获取cardetails中的imageId02的值等。

面对这样数组与对象相互嵌套的情况需要一步步将数据拆分,主要思想还是根据键取值,对于数组类型还是需要先根据”下标”取出元素。这里还需要用到JSONObject与JSONArray。

将上面的json数据简化就是:(这里保留个id便于识别)

{
    "cartypes":[
              {
                 "id":1,"bigimg": "img/dt-bkwl.jpg",
                 "cardetails": [{ "imageId02": "img/bkwl02.jpg}]
               }
               {
          "id":2,"bigimg": "img/xxx.jpg",
          "cardetails":[{"imageId002":"img/xx.jpg"}]
               }             
     ]
}

这就是简化了的json数据,可以看出这个串最外层是一个大的键为cartypes的对象,而它的值是json数组形式的比较复杂的json数据。继续分析 [ ]的部分,可以看到,里面有两个数组元素,每个元素分别是被{ }包起来的json对象,他们的元素组成相同,再看每个元素里面包含几个键值对的数据,其中键cardetails的值又是一个嵌套的json数组,里面包含一个json对象。分析完毕。那该怎样才能(拿到数据)解析呢?

 使用JSONObject与JSONArray

一般取数据有两种方式,看需要选择。

方式①:

通过 JSONObject.getString("键")直接获取,这种方式只能每次获取一个。

 方式②

通过构建与json对象相应的bean来获取。

我在写上面的例子时用到了两种方式,由于需要使用到 id,bigimg以及cardetails中的大部分数据,因此我在使用时将cardetails封装成一个bean,方便使用,而其他用到的比较少,因此就直接根据键获取值。

另外需要注意的是,JSONObject,JSONArray分别对应的是json数据的两种格式。即{"张三" : "男"}  , [{ 张三" : " 男" }] ,使用时需要将其转换成对应的对象。

如(示例):

JSONObject jsonObject = JSONObject.fromObject(json);   //将json字符串转换为JSONObject
JSONArray jsonArray = JSONArray.fromObject(json);  //将json字符串转换为JSONArray

还有一点需要指出:在取键值是始终需要根据键取值,从外到内,取内层的键的值需要先获取外层键的值,如果跨越取值会报错。

下面演示取值:

JSONObject jsonObject = JSONObject.fromObject(json);   //将json字符串转化为JSONObject
String cartypes=jsonObject.getString("cartypes");      //通过getString("cartypes")取出里面的信息
JSONArray jsonArray = JSONArray.fromObject(cartypes);  //将取到的cartypes对应的(一组)值字符串转换为JSONArray
String id= job.getString("id");             //取id 
String bigImg = job.getString("bigimg");    //大图
System.out.println("bigImg:"+bigImg);       //可以显示已经拿到bigimg的值

由于cardetails下的基本都是需要的值,一个一个取值比较麻烦,因此将cardetails封装成一个bean  如下:

Cardetails.java

public class Cardetails {
    private String imageId00;
    private String imageId01;
    private String imageId02;
    private String imageId03;
    private String imageId04;
    private String carname;
    private String carmatter;
    private String carvolume;
    private int sitnum;
    private String cargearbox;
    private String  caremission;
    private String carldone;
    private String carldtwo;
    private String carldthree;
    private String carldfour;
    //get set 方法以及toString方法略
}

到这里,需要将cardetails中的键全转成Cardetails中的属性,方法如下:

//将cardetail封装成bean
JSONArray carDetailArr=job.getJSONArray("cardetails");//将json字符串转化为JSONArray
JSONObject carDetailObj = carDetailArr.getJSONObject(0);//获取数组第一个元素
Cardetails cardetails = (Cardetails) JSONObject.toBean(carDetailObj, Cardetails.class);//封装成bean
System.out.println("cardetails:"+cardetails); //能获取到数据

最后附上部分代码:

public void getICarDetail(int id){
        String json=null;
        try {
             json=iCarDetail.getICarDetail(id);//这里既是获取上面json数据
        } catch (Exception e) {
            e.printStackTrace();
        }
        int jsonId=0;//json数组里的id值
        JSONObject jsonObject = JSONObject.fromObject(json);   //将json字符串转化为JSONObject
        String cartypes=jsonObject.getString("cartypes");//通过getString("cartypes")取出里面的信息
        JSONArray jsonArray = JSONArray.fromObject(cartypes);  //将取到的cartypes对应的(一组)值字符串转换为JSONArray
        //遍历jsonarray 数组
        if(jsonArray.size()>0){
            for(int i=0;i<jsonArray.size();i++){
                JSONObject job = jsonArray.getJSONObject(i);//把每一个对象转成json对象
                jsonId=(int)job.get("id"); //得到每个对象中的id值
                if(jsonId==id){
                    //获取相关值
                    String title = job.getString("title");            
                    String bigImg = job.getString("bigimg");          
                    String repayFirst = job.getString("repayfirst");  
                    String endrepayone = job.getString("endrepayone");
                    String endmonthone = job.getString("endmonthone");
                    String marketprice = job.getString("marketprice");
                    //将cardetail封装成bean
                    JSONArray carDetailArr=job.getJSONArray("cardetails");//将json字符串转化为JSONArray
                    JSONObject carDetailObj = carDetailArr.getJSONObject(0);//获取数组第一个元素
                    Cardetails cardetails = (Cardetails) JSONObject.toBean(carDetailObj, Cardetails.class);//封装成bean
                    //输出显示
                    System.out.println("******************");
                    System.out.println("jsonId:"+jsonId);
                    System.out.println("title:"+title);
                    System.out.println("bigImg:"+bigImg);
                    System.out.println("repayFirst:"+repayFirst);
                    System.out.println("endrepayone:"+endrepayone);
                    System.out.println("endmonthone:"+endmonthone);
                    System.out.println("marketprice:"+marketprice);
                    System.out.println("cardetails:"+cardetails);
}

相关文章

  • 在Spring Boot使用Undertow服务的方法

    在Spring Boot使用Undertow服务的方法

    Undertow是RedHAT红帽公司开源的产品,采用JAVA开发,是一款灵活,高性能的web服务器,提供了NIO的阻塞/非阻塞API,也是Wildfly的默认Web容器,这篇文章给大家介绍了在Spring Boot使用Undertow服务的方法,感兴趣的朋友跟随小编一起看看吧
    2023-05-05
  • java自动根据文件内容的编码来读取避免乱码

    java自动根据文件内容的编码来读取避免乱码

    这篇文章主要介绍了java自动根据文件内容的编码来读取避免乱码,需要的朋友可以参考下
    2014-02-02
  • springboot 集成redission 以及分布式锁的使用详解

    springboot 集成redission 以及分布式锁的使用详解

    这篇文章主要介绍了springboot 集成redission 以及分布式锁的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java不可变类机制浅析

    Java不可变类机制浅析

    所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。接下来通过本文给大家介绍Java不可变类机制,需要的朋友参考下
    2017-02-02
  • Java 信息摘要加密MD2、MD4、MD5实现详解

    Java 信息摘要加密MD2、MD4、MD5实现详解

    这篇文章主要介绍了Java 信息摘要加密MD2、MD4、MD5实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Spring Cloud集成Nacos Config动态刷新源码剖析

    Spring Cloud集成Nacos Config动态刷新源码剖析

    这篇文章主要为大家介绍了Spring Cloud集成Nacos Config动态刷新源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 浅谈springboot自动配置原理

    浅谈springboot自动配置原理

    这篇文章主要介绍了浅谈springboot自动配置原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • java实现大文件分割与合并的实例代码

    java实现大文件分割与合并的实例代码

    java实现大文件分割与合并的实例代码,需要的朋友可以参考一下
    2013-03-03
  • java SpringMVC学习使用详解

    java SpringMVC学习使用详解

    本篇文章主要介绍了java SpringMVC——如何获取请求参数详解,详细的介绍了每种参数注解的用法及其实例。感兴趣的小伙伴们可以参考一下
    2017-04-04
  • springmvc @RequestBody String类型参数的使用

    springmvc @RequestBody String类型参数的使用

    这篇文章主要介绍了springmvc @RequestBody String类型参数的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论