信仰和思想有三重身份,它是历史的子女、将来的母亲,但它们一直是时间的仆人。
前言
在之前我的一篇博客: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;
}
}
解析完成: