一、JSONObject和JSONArray的数据表示形式

JSONObject的数据是用 {  } 来表示的,

        例如:   { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业", "content" : null  }  

而JSONArray,顾名思义是由JSONObject构成的数组,用  [ { } , { } , ......  , { } ]  来表示

       例如:   [ {  "id" : "123", "courseID" : "huangt-test", "title" : "提交作业" }  ,  {  "content" : null, "beginTime" : 1398873600000  "endTime" } ] ; 

        表示了包含2个JSONObject的JSONArray。

可以看到一个很明显的区别,一个用的是 {  }  ,一个最外面用的是 [  ]  ;

取哪个用哪个

1. 如取data以及data下的任意key(同级,不能取data.report下的trackInfo,如果有和report同级的可以取到) (JSONObject {})则为

JSONObject data_action = responseToJson.getJSONObject("data").getJSONObject("action");

2. 如取nodes(JSONArray []) 则为

JSONArray nodes = responseToJson.getJSONArray("nodes");

3. 如取type (String "")则为

String nodes_type = responseToJson.getJSONArray("nodes").getJSONObject(0).getJSONArray("nodes").getJSONObject(0).getString("type");

特殊说明:其实type应该按int类型取,接口返回什么类型就按什么类型取就行,为了保持统一,判断的时候我再转回来

if (Integer.parseInt(nodes_type) != 1054) {

4. 如取level (Integer)则为
Integer nodes_level = responseToJson.getJSONArray("nodes").getJSONObject(0).getJSONArray("nodes").getJSONObject(0).getInteger("level");

5. 如取designate_mode(String "") 则为
String kubox_designate_mode = responseToJson.getJSONObject("data").getJSONObject("action").getJSONObject("report").getJSONObject("trackInfo").getString("designate_mode");

java 解析数组的json jsonobject解析数组_json

java 解析数组的json jsonobject解析数组_json_02

 

package com.alibaba.logPlayBack.sdksearch.searchScene;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.logPlayBack.sdksearch.logDeal.logJoinPrint;

public class default_page {
    /**
     * @param responseToJson
     * @param count          default_page为搜索默认页场景
     */
    public static void parse2JSON(JSONObject requestToJson, JSONObject responseToJson, int count) {

        boolean default_page = requestToJson.getString("appScene").equals("default_page");

        if (default_page) {

            // 取[]是JSONArray,如nodes: [] ,取{}是JSONObject,如data:{},取int类型的返回值是getString,如status: 0
            // 发现在浏览器里的返回key没有"",如level: 0,  在Charles里key有"",如"level": 0,

            /**
             * {
             *     "data": {
             *        "newSearch": 0,
             *        "action": {
             *           "report": {
             *              "trackInfo": {
             *                 "engine": "xx"
             *                                }
             *                    }
             *        },
             *        "status": 0
             *    },
             *     "more": false,
             *     "type": 0,
             *     "nodes": [{
             *        "level": 1,
             *        "more": false,
             *        "type": 0,
             *        "nodes": [{
             *           "data": {
             *                "defaultTab": "xx"
             *                    },
             *             "style": [
             *                   {
             *                      "type": 0
             *                 }
             *            ],
             *            "id": 0
             *          }
             *  ],
             */

            // 1. 返回类型为JSONObject,data: {}
            JSONObject data = responseToJson.getJSONObject("data");
            JSONObject action = responseToJson.getJSONObject("data").getJSONObject("action");
            JSONObject report = responseToJson.getJSONObject("data").getJSONObject("action").getJSONObject("report");
//                System.out.println("report为==" + report);
            String trackInfo = responseToJson.getJSONObject("data").getJSONObject("action").getJSONObject("report").getString("trackInfo");
//                System.out.println("trackInfo为==" + trackInfo);

            if (responseToJson.containsKey("data")) {
                if (data.containsKey("action")) {

                    if (!action.isEmpty()) {
                        if (!report.containsKey("trackInfo")) {
                            System.err.println(logJoinPrint.bugDesc(requestToJson, count) + "不包含trackInfo");
                        }
//                            System.out.println(logJoinPrint.passDesc(requestToJson, count) + "包含trackInfo");

                    } else {
                        System.err.println(logJoinPrint.bugDesc(requestToJson, count) + "data.action为空");
                    }
                } else {
                    System.err.println(logJoinPrint.bugDesc(requestToJson, count) + "不包含action");
                }

                // 2. 返回类型为String,status: 0
                // 多种写法,getString getInteger
//                String data_status = responseToJson.getJSONObject("data").getString("status");
                Integer status = responseToJson.getJSONObject("data").getInteger("status");
//                System.out.println("第" + count + "条日志,status为:" + data_status);
                if (data.containsKey("status")) {
                    if (!String.valueOf(status).isEmpty()) {
//                            System.out.println(logJoinPrint.passDesc(requestToJson, count) + "status不为空");

                        // 如果上面用的是getString,则value取值为String,data_status.equals("0");如果是getInteger,则value取值为String.valueOf,int转换为String;或者直接int类型判断,data_status==0
                        // 因为接口返回为int类型,所以用Integer
//                if (data_status.equals("0")) {
//                if (String.valueOf(data_status).equals("0")) {
                        if (status == 0) {
//                            System.out.println(logJoinPrint.passDesc(requestToJson, count) + "status为0");
                        } else {
                            System.err.println(logJoinPrint.bugDesc(requestToJson, count) + "status不为0");
                        }

                    } else {
                        System.err.println(logJoinPrint.bugDesc(requestToJson, count) + "status为空");
                    }
                } else {
                    System.err.println(logJoinPrint.bugDesc(requestToJson, count) + "不包含status");
                }

                // 3. 返回类型为JSONArray,nodes: [] 数组不可以用
                JSONArray nodes = responseToJson.getJSONArray("nodes");

                // {[{[{{}}],[]}]} 想得到哪个值,用哪个方法取,上面获取到的是[],接下来是[]里的{},再接下来是{}里的[],再再接下来是[]里的{}
                JSONArray nodes_nodes = nodes.getJSONObject(0).getJSONArray("nodes");
                /**
                 * nodes: [
                 *  {
                 *      level: 1,
                 *      more: false,
                 *      type: 0,
                 *      nodes: [
                 *          {
                 *              data: {},
                 *              type: 1041,
                 *              nodes: [],
                 *              style: [],
                 *              id: 0
                 *          }
                 *      ],
                 *      style: [],
                 *      id: 0
                 *  },
                 *  {}
                 */
                // type为[{[{}]}]最内层的JSONObject
                // 如果value是String类型,则用JSONObject就行,如下
//                JSONObject nodes_nodes_type = nodes_nodes.getJSONObject(0).getJSONObject("type");
                // 如果value是int类型,则需要用getInteger或者getString,否则会报错
                String nodes_nodes_type = nodes_nodes.getJSONObject(0).getString("type");
//                System.out.println("第" + count + "条日志,type为:" + nodes_nodes_type);

                if (!nodes_nodes_type.isEmpty()) {
//                    System.out.println(logJoinPrint.passDesc(requestToJson, count) + "nodes_nodes_type数组不为空");
                    // String类型转换为int类型
                    if (Integer.parseInt(nodes_nodes_type) > 1000) {
//                        System.out.println(logJoinPrint.passDesc(requestToJson, count) + "nodes_nodes_type为" + nodes_nodes_type);

                    } else {
                        System.err.println(logJoinPrint.bugDesc(requestToJson, count) + "nodes_nodes_type错误");
                    }
                } else {
                    System.err.println(logJoinPrint.bugDesc(requestToJson, count) + "nodes_nodes_type数组为空");
                }

            }

        }

        System.out.println("搜索场景【mobile_multi】日志回放结束,共" + count + "条日志");


    }
}

运行结果:

java 解析数组的json jsonobject解析数组_数组_03

 



java 解析数组的json jsonobject解析数组_数组_04

判断json是否为空,转换为toString()

if (TextUtils.isEmpty(responseToJson.toString())) {

/Users/xx/.m2/repository/com/alibaba/fastjson/1.2.58/fastjson-1.2.58.jar!/com/alibaba/fastjson/JSON.class

public String toString() {
    return this.toJSONString();
}

判断jsonArray数组长度

java 解析数组的json jsonobject解析数组_System_05

 

JSONArray duration = data.getJSONObject("filter").getJSONArray("duration");

duration.size();
System.out.println("==duration的长度为"+duration.size());

// JSONArray数组长度,size()方法
if(duration.size()!=5){
    System.err.println(logJoinPrint.bugDesc(requestToJson, count) + "duration.size();筛选项数目错误,不为5");

}

 

解析过程遇到的问题积累


// 获取value的值
            String value = requestToJson.getString(key);
            value.replace("\\\\", "\\");
//            System.out.println("测试" + value);
            try {
                // "trackInfo":"{"group_id":"xx","object_url":"xx:\/\/xx\/series?title=生死连&showId=xx&siteId=14&keyword=生死连&trackInfoAppend={\"group_num\":1}","object_type":3,"group_num":1,"item_log":"eps_t~1$site~14$show_id~xx$doc_source~1$eng_source~6$sp_id~xx","object_num":1,"source_id":14,"object_title":"查看更多","group_type":1}",
                // "object_url":"xx:\/\/xx\/series?title=生死连&showId=xx&siteId=14&keyword=生死连&trackInfoAppend={\"group_num\":1}"
                
                // 如果为contains的话,value可能在头中尾包含{,中尾部包含{ 但又不是JSONObject,无法解析
//                 if (value.contains("{")) {
                     // 改为startsWith,则不会出现上面的情况
                if (value.startsWith("{")) {
//                    Log.error("lishan==="+value);
                    // [ERROR] lishan===xx://xx/xx?title=琅琊榜&showId=xx&siteId=7&keyword=琅琊榜胡歌版&trackInfoAppend={"group_num":1}
                    // 递归遍历,第一次取到的是外层json,如果value里面还有json,再调用一次。这就是递归遍历
                    requestJsonToMap(JSONObject.parseObject(value), resultMap);
                } else {
                    resultMap.put(key, value);
                }
            } catch (Exception e) {
                e.printStackTrace();
                Log.error("lishan==="+value);
            }


 

java 解析数组的json jsonobject解析数组_System_06

 

修改后的效果:

java 解析数组的json jsonobject解析数组_java 解析数组的json_07

 

 

待续。。