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

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

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

 

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

  1. <dependency>
  2. <groupId>net.sf.json-lib</groupId>
  3. <artifactId>json-lib</artifactId>
  4. <version>2.4</version>
  5. <classifier>jdk15</classifier>
  6. </dependency>

 

 json数据:

  1. {
  2. "cartypes":[
  3. {"id":1,"imgUrl":"img/l.jpg","bigimg": "img/d.jpg","title":"别克威朗","marketprice":"15.29","periods":"12",
  4. "endrepayone":"96800","endrepaytwo":"96800","endrepaythree":"93000",
  5. "endmonthone":"3408","endmonthtwo":"3408","endmonththree":"3278",
  6. "repayfirst":"15290","repaytwo":"22935", "repaythree":"30580",
  7. "monthrepayone":"3578","monthrepaytwo":"2878","monthrepaythree":"2478",
  8. "cardetails":
    [{
  9. "imageId00": "img/first-bkwl.jpg",
  10. "imageId01": "img/bkwl01.jpg",
  11. "imageId02": "img/bkwl02.jpg",
  12. "imageId03": "img/bkwl03.jpg",
  13. "imageId04": "img/bkwl04.jpg",
  14. "carname": "别克",
  15. "carmatter": "威朗",
  16. "carvolume":"1.5L",
  17. "sitnum":"5",
  18. "cargearbox":"6挡手自一体",
  19. "caremission":"国V",
  20. "carldone":"一体式座舱",
  21. "carldtwo":"绒面内饰",
  22. "carldthree":"全景天窗",
  23. "carldfour":"展翼型HID大灯"
  24. }]
  25. },
  26. {"id":2,"imgUrl":"img/l.jpg","bigimg": "img/d.jpg","title":"英菲尼迪","marketprice":"18.98","periods":"12",
  27. "endrepayone":"126800","endrepaytwo":"126800","endrepaythree":"126800",
  28. "endmonthone":"4458","endmonthtwo":"4458","endmonththree":"4458",
  29. "repayfirst":"18980","repaytwo":"28470", "repaythree":"37960",
  30. "monthrepayone":"2738","monthrepaytwo":"1878","monthrepaythree":"998",
  31. "cardetails":
    [{
    "imageId00": "img/first.jpg",
  32. "imageId01": "img/yfnd01.jpg",
  33. "imageId02": "img/yfnd02.jpg",
  34. "imageId03": "img/yfnd03.jpg",
  35. "imageId04": "img/yfnd04.jpg",
  36. "carname": "英菲尼迪",
  37. "carmatter": "ESQ",
  38. "carvolume":"1.6L",
  39. "sitnum":"5",
  40. "cargearbox":"CVT无级变速",
  41. "caremission":"国V",
  42. "carldone":"定制轮毂",
  43. "carldtwo":"多功能方向盘",
  44. "carldthree":"LED尾灯",
  45. "carldfour":"真皮座椅"
  46. }]
    }
    ]
  47. }

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

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

 

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

  1. {
  2. "cartypes":[
  3. {
  4. "id":1,"bigimg": "img/dt-bkwl.jpg",
  5. "cardetails": [{ "imageId02": "img/bkwl02.jpg}]
  6. }

    {
              "id":2,"bigimg": "img/xxx.jpg",
              "cardetails":[{"imageId002":"img/xx.jpg"}]
    }         
  7. ]
  8. }

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

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

方式①:

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

 方式②

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

 

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

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

如(示例):

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

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

下面演示取值:

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

 

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

Cardetails.java

  1. public class Cardetails {
  2. private String imageId00;
  3. private String imageId01;
  4. private String imageId02;
  5. private String imageId03;
  6. private String imageId04;
  7. private String carname;
  8. private String carmatter;
  9. private String carvolume;
  10. private int sitnum;
  11. private String cargearbox;
  12. private String caremission;
  13. private String carldone;
  14. private String carldtwo;
  15. private String carldthree;
  16. private String carldfour;
  17. //get set 方法以及toString方法略
  18. }

 

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

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

最后附上部分代码:

  1. public void getICarDetail(int id){
  2. String json=null;
  3. try {
  4. json=iCarDetail.getICarDetail(id);//这里既是获取上面json数据
  5. } catch (Exception e) {
  6. e.printStackTrace();
  7. }
  8. int jsonId=0;//json数组里的id值
  9. JSONObject jsonObject = JSONObject.fromObject(json); //将json字符串转化为JSONObject
  10. String cartypes=jsonObject.getString("cartypes");//通过getString("cartypes")取出里面的信息
  11. JSONArray jsonArray = JSONArray.fromObject(cartypes); //将取到的cartypes对应的(一组)值字符串转换为JSONArray
  12. //遍历jsonarray 数组
  13. if(jsonArray.size()>0){
  14. for(int i=0;i<jsonArray.size();i++){
  15. JSONObject job = jsonArray.getJSONObject(i);//把每一个对象转成json对象
  16. jsonId=(int)job.get("id"); //得到每个对象中的id值
  17. if(jsonId==id){
  18. //获取相关值
  19. String title = job.getString("title");
  20. String bigImg = job.getString("bigimg");
  21. String repayFirst = job.getString("repayfirst");
  22. String endrepayone = job.getString("endrepayone");
  23. String endmonthone = job.getString("endmonthone");
  24. String marketprice = job.getString("marketprice");
    //将cardetail封装成bean
  25. JSONArray carDetailArr=job.getJSONArray("cardetails");//将json字符串转化为JSONArray
  26. JSONObject carDetailObj = carDetailArr.getJSONObject(0);//获取数组第一个元素
  27. Cardetails cardetails = (Cardetails) JSONObject.toBean(carDetailObj, Cardetails.class);//封装成bean
  28. //输出显示
  29. System.out.println("******************");
  30. System.out.println("jsonId:"+jsonId);
  31. System.out.println("title:"+title);
  32. System.out.println("bigImg:"+bigImg);
  33. System.out.println("repayFirst:"+repayFirst);
  34. System.out.println("endrepayone:"+endrepayone);
  35. System.out.println("endmonthone:"+endmonthone);
  36. System.out.println("marketprice:"+marketprice);
  37. System.out.println("cardetails:"+cardetails);
    }

 

版权声明:本文为jhcai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jhcai/p/7910350.html