zoukankan      html  css  js  c++  java
  • 复杂的json分析

    在复杂的JSON数据的格式中,往往会对JSON数据进行嵌套,这样取值会比之前的取值稍微复杂一点,但是只要思路清晰,其实取法还是一样的。就跟if else语句一样,如果if中套if,if中再套if,写的规范了还行,要是代码格式不规范,那我们肯定也看着麻烦。所以啊,对于json嵌套,只要记住符号“:”前是键,符号后是值大括号成对找,一层层剥开,就清楚了。 举个例子说明,如下:

    从外到里看,例子中就是一个数组,数组里面是两个json格式的字符串。这样分析思路就清晰多了。

    例如以下的嵌套JSON数据:

    [java] view plain copy
     
    1. {  
    2.         "resultcode":"200",  
    3.         "reason":"成功的返回",  
    4.         "result":{  
    5.         "company":"顺丰",  
    6.         "com":"sf",  
    7.         "no":"575677355677",  
    8.         "list":[  
    9.             {  
    10.             "datetime":"2013-06-25 10:44:05",  
    11.             "remark":"已收件",  
    12.             "zone":"台州市"  
    13.             },  
    14.             {  
    15.             "datetime":"2013-06-25 11:05:21",  
    16.             "remark":"快件在 台州 ,准备送往下一站 台州集散中心 ",  
    17.             "zone":"台州市"  
    18.             }  
    19.         ],  
    20.         "status":1  
    21.         },  
    22.         "error_code":0  
    23. }  

    那么这种多重嵌套的JSON数据应该从何入手?

    道理很简单,每一层都当作是一个简单JSON数据,我们来分析一下:

    这里的嵌套JSON数据,我们可以先看第一层,其实就是如下:

    [java] view plain copy
     
    1. {  
    2.      "resultcode":"200",  
    3.      "reason":"成功的返回",  
    4.      "error_code":0  
    5. }  

    那么第二层就是在第一层的里面,其实第二层也可以看做是单独的一层,可以看做是这样的:

    [java] view plain copy
     
    1. {  
    2.    "result":{  
    3.     "company":"顺丰",  
    4.     "com":"sf",  
    5.     "no":"575677355677",  
    6.     "status":1  
    7.    }  
    8. }   

    接下来最内的一层是JSONArray,对于这层,我们可以看成是数组的形式。

    分析完上面复杂的JSON,知道怎么获取需要的值了吗?

    根据分析的思路,我们来一一获取,Java代码如下:

    package com.json;  
      
    import net.sf.json.JSONArray;  
    import net.sf.json.JSONObject;  
      
    public class JsonObjectAndJsonArrayDemo {  
        public static void main(String[] args){  
            //复杂的json数据  
            String jsonStr = "{"resultcode":"200","reason":"成功的返回","result":{"company":"顺丰","com":"sf","  
                    + ""no":"575677355677","list":[{"datetime":"2013-06-25 10:44:05","remark":"已收件","zone":"台州市"},"  
                    + "{"datetime":"2013-06-25 11:05:21","remark":"快件在 台州 ,准备送往下一站 台州集散中心 ","zone":"台州市"}],"status":1},"  
                    + ""error_code":0}";  
            JSONObject json = JSONObject.fromObject(jsonStr); //得到整个json串  
            System.out.println("resultcode:"+json.getString("resultcode"));  //根据key得到value:200  
            System.out.println("reason:"+json.getString("reason"));  //根据key得到value:成功的返回  
              
            //当遇到result时,也是将它当成一个整体串  
            System.out.println("company:"+JSONObject.fromObject(json.getString("result")).getString("company"));  
            System.out.println("com:"+JSONObject.fromObject(json.getString("result")).getString("com"));  
            System.out.println("no:"+JSONObject.fromObject(json.getString("result")).getString("no"));  
              
            //当遇到再次嵌套时,此时的list是一个JSONArray,所以需要将其当作数组的形式处理,其实还是一个串  
            //get(i)以下标为主,里面的东西,其实也是一个json的形式数据,你可以不看外面怎么嵌套,按道理只当成单单一个json串处理即可  
            System.out.println("list(0).datetime:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(0)).getString("datetime"));  
              
            System.out.println("list(0).remark:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(0)).getString("remark"));  
              
            System.out.println("list(0).zone:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(0)).getString("zone"));  
              
            System.out.println("list(1).datetime:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(1)).getString("datetime"));  
              
            System.out.println("list(1).remark:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(1)).getString("remark"));  
              
            System.out.println("list(1).zone:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(1)).getString("zone"));  
              
            System.out.println("status:"+JSONObject.fromObject(json.getString("result")).getString("status"));  
              
            System.out.println("reason:"+json.getString("error_code"));  
        }  
    }  
    

      

  • 相关阅读:
    《数据结构》2.2顺序表(sequence list)
    《算法竞赛入门经典》6.3.1二叉树-小球下落
    java_时间戳与Date_相互转化
    java事物
    Mysql如何向存在外键的数据表中插入数据
    git基本配置
    mysql时间属性之时间戳和datetime之间的转换
    【转】变量命名(简短且无歧义)
    【转】mybatis实战教程(mybatis in action),mybatis入门到精通
    [转]DAO层,Service层,Controller层、View层
  • 原文地址:https://www.cnblogs.com/fengli9998/p/7381862.html
Copyright © 2011-2022 走看看