JSON解析实战升级篇:JSON数组中含JSON数组

信仰和思想有三重身份,它是历史的子女、将来的母亲,但它们一直是时间的仆人。

前言

在之前我的一篇博客:JSON解析实战篇:JSON数组中含JSON数组中描述了关于一个比较复杂的JSON数据解析问题,也给出了解决方案,但是思路有些偏向于面向过程,代码稍显冗余。今天运用了面向对象思想,给出一个升级版本:

  • 通过类的构造器,建立类间的映射关系,创建对象

问题描述

接收的JSON数据如下:

[{
  "object": [{
    "content": 103,
    "name": "编码",
    "code": "code"
  }, {
    "content": "经理层(部门)",
    "name": "名称",
    "code": "name"
  }, {
    "content": "0001A110000000002D15",
    "name": "上级部门",
    "code": "pk_fatherorg"
  }, {
    "content": 10,
    "name": "上级业务单元编码",
    "code": "fatherorg_code"
  }, {
    "content": "中南控股集团有限公司",
    "name": "上级业务单元名称",
    "code": "fatherorg_name"
  }, {
    "content": "中南集团",
    "name": "所属集团名称",
    "code": "group_name"
  }, {
    "content": "1001B210000000EQ6D5U",
    "name": "组织主键",
    "code": "pk_org"
  }, {
    "content": 0,
    "name": "删除标志",
    "code": "dr"
  }, {
    "content": "2020-01-02 11:26:25",
    "name": "时间戳",
    "code": "ts"
  }, {
    "content": "Y",
    "name": "是否生效状态",
    "code": "iseffect"
  }, {
    "content": "控股",
    "name": "所属产业",
    "code": "corp"
  }]
}, {
  "object": [{
    "content": 102,
    "name": "编码",
    "code": "code"
  }, {
    "content": "董事会(部门)",
    "name": "名称",
    "code": "name"
  }, {
    "content": "0001A110000000002D15",
    "name": "上级部门",
    "code": "pk_fatherorg"
  }, {
    "content": 10,
    "name": "上级业务单元编码",
    "code": "fatherorg_code"
  }, {
    "content": "中南控股集团有限公司",
    "name": "上级业务单元名称",
    "code": "fatherorg_name"
  }, {
    "content": "中南集团",
    "name": "所属集团名称",
    "code": "group_name"
  }, {
    "content": "1001B210000000EQ6D61",
    "name": "组织主键",
    "code": "pk_org"
  }, {
    "content": 0,
    "name": "删除标志",
    "code": "dr"
  }, {
    "content": "2018-11-21 09:06:00",
    "name": "时间戳",
    "code": "ts"
  }, {
    "content": "Y",
    "name": "是否生效状态",
    "code": "iseffect"
  }, {
    "content": "控股",
    "name": "所属产业",
    "code": "corp"
  }]
}]

简化一下,发现这是一个由JSON数组对象构成的JSON数组

[{
  "object": [{
    "content": "103",
    "name": "编码",
    "code": "code"
  },{
    "content": "控股",
    "name": "所属产业",
    "code": "corp"
  }]
}, {
  "object": [{
    "content": 102,
    "name": "编码",
    "code": "code"
  },{
    "content": "控股",
    "name": "所属产业",
    "code": "corp"
  }]
}]

需要解析成的数据格式如下:

[{
		"code":"103",
		"corp":"控股",
		"dr":"0",
		"fatherorg_code":"10",
		"fatherorg_name":"中南控股集团有限公司",
		"group_name":"中南集团",
		"iseffect":"Y",
		"name":"经理层(部门)",
		"pk_fatherorg":"0001A110000000002D15",
		"pk_org":"1001B210000000EQ6D5U",
		"ts":"2020-01-02 11:26:25"
	},{
		"code":"102",
		"corp":"控股",
		"dr":"0",
		"fatherorg_code":"10",
		"fatherorg_name":"中南控股集团有限公司",
		"group_name":"中南集团",
		"iseffect":"Y",
		"name":"董事会(部门)",
		"pk_fatherorg":"0001A110000000002D15",
		"pk_org":"1001B210000000EQ6D61",
		"ts":"2018-11-21 09:06:00"
}]

仔细观察后发现之前接收到的JSON数组中的每一个小数组中每一个JSON对象的code所对应的值作为属性名content对应的值作为属性值构成的一个新JSON对象,再由这一个个JSON对象构成一个JSON数组:
在这里插入图片描述

编码开始

首先创建接收JSON小数组中的JSON对象的Java模板类:

/**
 * @author guqueyue
 * @Date 2020/4/7
 * 输入模板
 **/
@Data //lombok插件的注解,若是没有用lombok插件,请自行生成getter、setter方法
public class DTO {
    private String name;
    private String code;
    private String content;
}

再创建输出模板类,通过构造方法构建两个类之间的映射关系

/**
 * @author guqueyue
 * @Date 2020/4/7
 * VO:输出模板
 **/
@Data // lombok插件的注解,若是没有用lombok插件,请自行生成getter、setter方法
public class VO {
    private String code;
    private String name;
    private String pkFatherorg;
    private String fatherorgCode;
    private String fatherorgName;
    private String groupName;
    private String pkOrg;
    private String dr;
    private String ts;
    private String iseffect;
    private String corp;

    public VO() {
    }

    public VO(JSONArray jsonArray) {
        // 遍历得到的JSON数组
        int size = jsonArray.size();
        for (int i = 0; i < size; i++) {
            // 把JSON小数组对象转化成DTO对象
            DTO dto = jsonArray.getObject(i, DTO.class);
            switch (dto.getCode()) {
                case "code":
                    this.code = dto.getContent();
                    break;
                case "corp":
                    this.corp = dto.getContent();
                    break;
                case "dr":
                    this.dr = dto.getContent();
                    break;
                case "fatherorg_code":
                    this.fatherorgCode = dto.getContent();
                    break;
                case "fatherorg_name":
                    this.fatherorgName = dto.getContent();
                    break;
                case "group_name":
                    this.groupName = dto.getContent();
                    break;
                case "iseffect":
                    this.iseffect = dto.getContent();
                    break;
                case "name":
                    this.name = dto.getContent();
                    break;
                case "pk_fatherorg":
                    this.pkFatherorg = dto.getContent();
                    break;
                case "pk_org":
                    this.pkOrg = dto.getContent();
                    break;
                case "ts":
                    this.ts = dto.getContent();
                    break;
                default:
                    break;
            }
        }
    }
}

核心代码:

/**
 * @author guqueyue
 * @Date 2020/4/7
 * JSON数组中每个元素为JSON数组的示例解析
 **/
public class Test {

    // 声明接收到的JSON数据
    private static final String jsonString = "[{\n" +
            "  \"object\": [{\n" +
            "    \"content\": 103,\n" +
            "    \"name\": \"编码\",\n" +
            "    \"code\": \"code\"\n" +
            "  }, {\n" +
            "    \"content\": \"经理层(部门)\",\n" +
            "    \"name\": \"名称\",\n" +
            "    \"code\": \"name\"\n" +
            "  }, {\n" +
            "    \"content\": \"0001A110000000002D15\",\n" +
            "    \"name\": \"上级部门\",\n" +
            "    \"code\": \"pk_fatherorg\"\n" +
            "  }, {\n" +
            "    \"content\": 10,\n" +
            "    \"name\": \"上级业务单元编码\",\n" +
            "    \"code\": \"fatherorg_code\"\n" +
            "  }, {\n" +
            "    \"content\": \"中南控股集团有限公司\",\n" +
            "    \"name\": \"上级业务单元名称\",\n" +
            "    \"code\": \"fatherorg_name\"\n" +
            "  }, {\n" +
            "    \"content\": \"中南集团\",\n" +
            "    \"name\": \"所属集团名称\",\n" +
            "    \"code\": \"group_name\"\n" +
            "  }, {\n" +
            "    \"content\": \"1001B210000000EQ6D5U\",\n" +
            "    \"name\": \"组织主键\",\n" +
            "    \"code\": \"pk_org\"\n" +
            "  }, {\n" +
            "    \"content\": 0,\n" +
            "    \"name\": \"删除标志\",\n" +
            "    \"code\": \"dr\"\n" +
            "  }, {\n" +
            "    \"content\": \"2020-01-02 11:26:25\",\n" +
            "    \"name\": \"时间戳\",\n" +
            "    \"code\": \"ts\"\n" +
            "  }, {\n" +
            "    \"content\": \"Y\",\n" +
            "    \"name\": \"是否生效状态\",\n" +
            "    \"code\": \"iseffect\"\n" +
            "  }, {\n" +
            "    \"content\": \"控股\",\n" +
            "    \"name\": \"所属产业\",\n" +
            "    \"code\": \"corp\"\n" +
            "  }]\n" +
            "}, {\n" +
            "  \"object\": [{\n" +
            "    \"content\": 102,\n" +
            "    \"name\": \"编码\",\n" +
            "    \"code\": \"code\"\n" +
            "  }, {\n" +
            "    \"content\": \"董事会(部门)\",\n" +
            "    \"name\": \"名称\",\n" +
            "    \"code\": \"name\"\n" +
            "  }, {\n" +
            "    \"content\": \"0001A110000000002D15\",\n" +
            "    \"name\": \"上级部门\",\n" +
            "    \"code\": \"pk_fatherorg\"\n" +
            "  }, {\n" +
            "    \"content\": 10,\n" +
            "    \"name\": \"上级业务单元编码\",\n" +
            "    \"code\": \"fatherorg_code\"\n" +
            "  }, {\n" +
            "    \"content\": \"中南控股集团有限公司\",\n" +
            "    \"name\": \"上级业务单元名称\",\n" +
            "    \"code\": \"fatherorg_name\"\n" +
            "  }, {\n" +
            "    \"content\": \"中南集团\",\n" +
            "    \"name\": \"所属集团名称\",\n" +
            "    \"code\": \"group_name\"\n" +
            "  }, {\n" +
            "    \"content\": \"1001B210000000EQ6D61\",\n" +
            "    \"name\": \"组织主键\",\n" +
            "    \"code\": \"pk_org\"\n" +
            "  }, {\n" +
            "    \"content\": 0,\n" +
            "    \"name\": \"删除标志\",\n" +
            "    \"code\": \"dr\"\n" +
            "  }, {\n" +
            "    \"content\": \"2018-11-21 09:06:00\",\n" +
            "    \"name\": \"时间戳\",\n" +
            "    \"code\": \"ts\"\n" +
            "  }, {\n" +
            "    \"content\": \"Y\",\n" +
            "    \"name\": \"是否生效状态\",\n" +
            "    \"code\": \"iseffect\"\n" +
            "  }, {\n" +
            "    \"content\": \"控股\",\n" +
            "    \"name\": \"所属产业\",\n" +
            "    \"code\": \"corp\"\n" +
            "  }]\n" +
            "}]\n";

    public static void main(String[] args) {
        // 创建list集合接收解析好的数据
        List<VO> voList = new ArrayList<VO>();
        // JSON字符串转为JSON数组
        JSONArray jsonBigArray = JSON.parseArray(jsonString);
        int size = jsonBigArray.size();
        for (int i = 0; i < size; i++) {
            // 获取JSON小数组对象
            JSONObject jsonObject = jsonBigArray.getJSONObject(i);
            // 将JSON小数组对象转换成标准JSON数组
            JSONArray jsonArray  = toJSONArray(jsonObject);
            // 得到输出对象
            VO vo = new VO(jsonArray);
            // 将输出对象添加到集合中
            voList.add(vo);
        }

       // 将得到的集合中的对象分别打印到控制台
        for (VO vo : voList) {
            System.out.println(vo);
        }

    }

    /**
     * 将JSON数组对象转换成JSON数组
     * 如: {"object":[{name:"小明", age:18}, {name:"小晏", age:11}]}
     * 转换成 -> [{name:"小明", age:18}, {name:"小晏", age:11}
     * @param jsonObject
     * @return
     */
    private static JSONArray toJSONArray(JSONObject jsonObject) {
        // 将JSON对象转换成JSON字符串
        String str = JSON.toJSONString(jsonObject);
        // 切割成标准JSON字符串
        String jsonString = str.substring(10, str.length() - 1);
        // 将标准JSON字符串转换成JSON数组
        JSONArray jsonArray = JSON.parseArray(jsonString);
        return jsonArray;
    }
}

解析完成:
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值