json解析

对于key不固定的json串解析起来都比较恶心,一般都会让后端直接返回key值固定的,可有的时候我们的好基友并不同意这个姿势,举例如下

第一种只是key不同

{
    "errno": 0,
    "errmsg": "success",
    "data": {
        "5": [
            {
                "log_id": "88904874",
                "ext_flag": "0",
                "createTime": "2017-04-16 11:12:30",
                "companyName": "南昌01",
                "userName": "王文明",
                "telePhone": "",
                "thing": "创建了该运单(17040001) 开单时间:2017-04-16 11:12:45",
                "applicant": "",
                "modifyReason": "",
                "multifunc": "",
                "reserved": "",
                "from": 0,
                "payMode": "",
                "transInfo": [],
                "msg_infos": []
            }
        ],
        "20": [
            {
                "log_id": "88904873",
                "ext_flag": "0",
                "createTime": "2017-04-16 08:12:52",
                "companyName": "南昌01",
                "userName": "王文明",
                "telePhone": "",
                "thing": "创建了到网点小黑的运单",
                "applicant": "",
                "modifyReason": "",
                "multifunc": "",
                "reserved": "",
                "from": 0,
                "payMode": "",
                "transInfo": [],
                "msg_infos": []
            }
        ],
        "200": [
            {
                "log_id": "88904875",
                "ext_flag": "0",
                "createTime": "2017-04-16 10:12:52",
                "companyName": "南昌01",
                "userName": "王文明",
                "telePhone": "",
                "thing": "该运单由南昌01 王文明操作订单(订单号:W170400003)转运单生成",
                "applicant": "",
                "modifyReason": "",
                "multifunc": "",
                "reserved": "",
                "from": 0,
                "payMode": "",
                "transInfo": [],
                "msg_infos": []
            }
        ],
        "160": [
            {
                "log_id": "88904873",
                "ext_flag": "0",
                "createTime": "2017-04-16 11:14:52",
                "companyName": "南昌01",
                "userName": "王文明",
                "telePhone": "",
                "thing": "创建了到网点小黑的运单",
                "applicant": "",
                "modifyReason": "",
                "multifunc": "",
                "reserved": "",
                "from": 0,
                "payMode": "",
                "transInfo": [],
                "msg_infos": []
            }
        ],
        "8130": [
            {
                "log_id": "88904873",
                "ext_flag": "0",
                "createTime": "2017-04-16 11:12:52",
                "companyName": "南昌01",
                "userName": "王文明",
                "telePhone": "",
                "thing": "创建了到网点小黑的运单",
                "applicant": "",
                "modifyReason": "",
                "multifunc": "",
                "reserved": "",
                "from": 0,
                "payMode": "",
                "transInfo": [],
                "msg_infos": []
            }
        ],
        "8370": [
            {
                "log_id": "88904873",
                "ext_flag": "0",
                "createTime": "2017-02-16 11:12:52",
                "companyName": "南昌01",
                "userName": "王文明",
                "telePhone": "",
                "thing": "创建了到网点小黑的运单",
                "applicant": "",
                "modifyReason": "",
                "multifunc": "",
                "reserved": "",
                "from": 0,
                "payMode": "",
                "transInfo": [],
                "msg_infos": []
            }
        ],
        "8030": [
            {
                "log_id": "88904873",
                "ext_flag": "0",
                "createTime": "2017-03-16 11:12:52",
                "companyName": "南昌01",
                "userName": "王文明",
                "telePhone": "",
                "thing": "创建了到网点小黑的运单",
                "applicant": "",
                "modifyReason": "",
                "multifunc": "",
                "reserved": "",
                "from": 0,
                "payMode": "",
                "transInfo": [],
                "msg_infos": []
            }
        ]
    }
}


可使用如下方式解析

JSONObject result = new JSONObject(response);
                            LogInfo logInfo = new LogInfo();
                            Gson gson = new Gson();
                            Map<String, List<LogInfo.LogInfoItem>> logInfoMap = gson.fromJson(result.getJSONObject("data").toString(), new TypeToken<Map<String, List<LogInfo.LogInfoItem>>>() {
                            }.getType());
                            for (Map.Entry listEntry : logInfoMap.entrySet()) {
                                String type = LogInfoType.initType((String) listEntry.getKey());
                                for (LogInfo.LogInfoItem item : (List<LogInfo.LogInfoItem>) listEntry.getValue()) {
                                    item.type = TextUtils.isEmpty(type) ? "" : type;
                                    logInfo.list.add(item);
                                }
                            }
不要问我LogInfo LogInfo.LogInfoItem是啥
也可以使用手动方式解析

JSONObject result = new JSONObject(response);
                            LogInfo logInfo = new LogInfo();

                            JSONObject data = result.getJSONObject("data");
                            Iterator<String> iterator = data.keys();

                            while (iterator.hasNext()) {
                                String key = iterator.next();
                                String type = LogInfoType.initType(key);

                                JSONArray jsonArray = data.getJSONArray(key);
                                for (int i = 0; i < jsonArray.length(); i++) {
                                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                                    LogInfo.LogInfoItem item = LogInfo.LogInfoItem.objectFromData(jsonObject.toString());
                                    item.type = type;


                                    item.trans = LogInfo.TransInfo.objectFromData(jsonObject.getJSONObject("transInfo").toString());
                                    logInfo.list.add(item);
                                }
                            }

第二种json就比较恶心了,


{
    "errno": 0,
    "errmsg": "success",
    "data": {
        "5": [
            {
                "log_id": "88905577",
                "ext_flag": "0",
                "createTime": "2017-05-04 11:15:53",
                "companyName": "南昌01",
                "userName": "王文明",
                "telePhone": "",
                "thing": "创建了该运单(17050001) 开单时间:2017-05-04 11:15:13",
                "applicant": "",
                "modifyReason": "",
                "multifunc": "",
                "reserved": "",
                "from": 0,
                "payMode": "",
                "transInfo": [],
                "msg_infos": []
            }
        ],
        "20": [
            {
                "log_id": "88905578",
                "ext_flag": "0",
                "createTime": "2017-05-04 11:16:33",
                "companyName": "18811596967",
                "userName": "王文明",
                "telePhone": "18811596967",
                "thing": 0,
                "applicant": "",
                "modifyReason": "",
                "multifunc": "转交不可见",
                "reserved": "",
                "from": 0,
                "payMode": "现付",
                "transInfo": {
                    "companyName": "18811596967",
                    "transTime": "2017-05-04 11:16:22",
                    "transOrderNum": "",
                    "transStatus": "转交不可见",
                    "payMode": "现付",
                    "transType": "10",
                    "transPrice": "0",
                    "telePhone": "18811596967",
                    "payOver": "0",
                    "transRemark": "",
                    "tName": null,
                    "tPhone": "",
                    "tName1": null,
                    "tPhone1": "",
                    "tName2": null,
                    "tPhone2": "",
                    "transfer_pick_goods_price": 0,
                    "transfer_delivery_price": 0,
                    "transfer_freight_price": 0,
                    "transfer_handling_price": 0,
                    "transfer_misc_price": 0,
                    "transfer_local_pick_goods_price": 0,
                    "discount": 0,
                    "trans_batch_num": "ZJ2299917050001",
                    "pay_arrival": 0,
                    "transfer_pay_over": 0,
                    "transfer_price_received": 0,
                    "show_log_detail": 1,
                    "origin_point_order_id": "18055747",
                    "transfer_traffic_price": "",
                    "car_number": "",
                    "driver_name": "",
                    "driver_phone": ""
                },
                "msg_infos": []
            }
        ]
    }
}
当遇到这种情况,尽量与好基友沟通,如果实在是这种格式,一定要镇定,万万不可一言不合就爆他菊花
这种格式一出现,正常的解析方式肯定是不可以的了,只能自己手动解析,经楼主验证,这种格式不可用这种JSON解析类去解析,
只能用Json打头的小写的解析类去解析,原因请往下看
解析方法来了啊

JSONObject result = new JSONObject(response);
                            LogInfo logInfo = new LogInfo();

                            JSONObject data = result.getJSONObject("data");

                            Gson gson = new Gson();
                            JsonObject jsonData = gson.fromJson(data.toString(), JsonObject.class);
                            for (Map.Entry entry : jsonData.entrySet()) {
                                String key = (String) entry.getKey();
                                String type = LogInfoType.initType(key);
                                JsonArray jsonArray = jsonData.getAsJsonArray(key);
                                for (int i = 0; i < jsonArray.size(); i++) {
                                    JsonObject jsonObject = (JsonObject) jsonArray.get(i);
                                    LogInfo.LogInfoItem item = LogInfo.LogInfoItem.objectFromData(jsonObject.toString());
                                    item.type = type;
                                    JsonElement jsonTrans = jsonObject.get("transInfo");
                                    if (jsonTrans.isJsonArray()) {
                                        item.trans = null;
                                    }
                                    if (jsonTrans.isJsonObject()) {
                                        item.trans = LogInfo.TransInfo.objectFromData(jsonTrans.toString());
                                    }
                                    logInfo.list.add(item);
                                }
                            }

因为大写的Json解析类没有判断数组和对象的方法









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值