楔子:无处可去和无处可回,这和自由完全是两回事。- 宫部美雪《理由》
1.今日书签
Java中包含多层List对象集合嵌套的Json字符串直接转换为List对象集合实现方案。
2.自由自在
1)jar 包依赖
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
2)需要使用到:net.sf.json.JSONObject,不是 com.alibaba.fastjson
public static void main(String[] args) {
// 将JSON字符串转换成JSON对象
JSONObject jsonBean = JSONObject.fromObject(jsonObjectStr);
// 添加JSON对象中出现的需要转换的对象到Map中
Map<String, Class> classMap = new HashMap<>();
classMap.put("result", ResponsePageInfoBO.class);
classMap.put("recipeList", RecipeResponseBO.class);
classMap.put("recipeDrugDetailList", RecipeDrugResponseBO.class);
// 将JSON对象转换成JAVA对象
ReturnInfo returnInfo = (ReturnInfo) JSONObject.toBean(jsonBean, ReturnInfo.class, classMap);
System.out.println(JSON.toJSONString(returnInfo));
}
多层 List 集合的 Json 字符串转 Java List 对象集合中涉及到的实体对象案例:
注意:Java 对象的属性名要与 Json 字符串中出现的字段名称保持一致。
1)ResponsePageInfoBO
public class ResponsePageInfoBO implements Serializable {
private List<RecipeResponseBO> recipeList;
private Integer prePage;
private Integer pages;
private Integer nextPage;
private Boolean hasNextPage;
private Integer navigateLastPage;
private Integer navigatePages;
private Integer[] navigatePageNums;
private Integer size;
private Boolean isFirstPage;
private Integer startRow;
private Boolean hasPreviousPage;
private Integer navigateFirstPage;
private Integer total;
private Integer endRow;
private Integer pageNum;
private Integer pageSize;
private Boolean isLastPage;
public List<RecipeResponseBO> getRecipeList() {
return recipeList;
}
public void setRecipeList(List<RecipeResponseBO> recipeList) {
this.recipeList = recipeList;
}
// 此处省略get/set
......
}
2)RecipeResponseBO
public class RecipeResponseBO implements Serializable {
private List<RecipeDrugResponseBO> recipeDrugDetailList;
private String name;
private Integer age;
private Integer gender;
private String phoneNumber;
private String storeName;
private String doctorName;
private String symptom;
private String illness;
public List<RecipeDrugResponseBO> getRecipeDrugDetailList() {
return recipeDrugDetailList;
}
public void setRecipeDrugDetailList(List<RecipeDrugResponseBO> recipeDrugDetailList) {
this.recipeDrugDetailList = recipeDrugDetailList;
}
public String getName() {
return name;
}
// 此处省略get/set
......
}
3)RecipeDrugResponseBO
public class RecipeDrugResponseBO implements Serializable {
private String drugName;
private Integer num;
private String unit;
private String spec;
private String perNum;
private String perUnit;
private Integer dose;
private String usage;
private Integer usageFrequencyCode;
private String usageFrequencyName;
public String getDrugName() {
return drugName;
}
// 此处省略get/set
......
}
测试数据:
public static final String jsonObjectStr = "{\n" +
" \"result\": {\n" +
" \"endRow\": 1, \n" +
" \"firstPage\": false, \n" +
" \"hasNextPage\": false, \n" +
" \"hasPreviousPage\": false, \n" +
" \"lastPage\": false, \n" +
" \"recipeList\": [\n" +
" {\n" +
" \"age\": 32, \n" +
" \"doctorName\": \"陈医生\", \n" +
" \"recipeDrugDetailList\": [\n" +
" {\n" +
" \"dose\": 1, \n" +
" \"drugName\": \"板蓝根颗粒\", \n" +
" \"num\": 1, \n" +
" \"perNum\": \"1\", \n" +
" \"perUnit\": \"包\", \n" +
" \"spec\": \"2\", \n" +
" \"unit\": \"盒\", \n" +
" \"usage\": \"口服\", \n" +
" \"usageFrequencyCode\": 1, \n" +
" \"usageFrequencyName\": \"每天三次\"\n" +
" },\n" +
" {\n" +
" \"dose\": 1, \n" +
" \"drugName\": \"四季感冒灵\", \n" +
" \"num\": 1, \n" +
" \"perNum\": \"1\", \n" +
" \"perUnit\": \"包\", \n" +
" \"spec\": \"2\", \n" +
" \"unit\": \"盒\", \n" +
" \"usage\": \"口服\", \n" +
" \"usageFrequencyCode\": 1, \n" +
" \"usageFrequencyName\": \"每天三次\"\n" +
" }\n" +
" ], \n" +
" \"gender\": 1, \n" +
" \"illness\": \"感冒\", \n" +
" \"name\": \"谈笑\", \n" +
" \"phoneNumber\": \"19999999999\", \n" +
" \"storeName\": \"测试店\", \n" +
" \"symptom\": \"感冒\"\n" +
" }\n" +
" ], \n" +
" \"navigateFirstPage\": 1, \n" +
" \"navigateLastPage\": 1, \n" +
" \"navigatePages\": 8, \n" +
" \"navigatePageNums\": [\n" +
" 1\n" +
" ], \n" +
" \"nextPage\": 0, \n" +
" \"pageNum\": 1, \n" +
" \"pageSize\": 15, \n" +
" \"pages\": 1, \n" +
" \"prePage\": 0, \n" +
" \"size\": 1, \n" +
" \"startRow\": 1, \n" +
" \"total\": 1\n" +
" }, \n" +
" \"ok\": true\n" +
"}";
测试结果:
{
"ok": true,
"result": {
"endRow": 1,
"firstPage": false,
"hasNextPage": false,
"hasPreviousPage": false,
"lastPage": false,
"navigateFirstPage": 1,
"navigateLastPage": 1,
"navigatePageNums": [
1
],
"navigatePages": 8,
"nextPage": 0,
"pageNum": 1,
"pageSize": 15,
"pages": 1,
"prePage": 0,
"recipeList": [
{
"age": 32,
"doctorName": "陈医生",
"gender": 1,
"illness": "感冒",
"name": "谈笑",
"phoneNumber": "19999999999",
"recipeDrugDetailList": [
{
"dose": 1,
"drugName": "板蓝根颗粒",
"num": 1,
"perNum": "1",
"perUnit": "包",
"spec": "2",
"unit": "盒",
"usage": "口服",
"usageFrequencyCode": 1,
"usageFrequencyName": "每天三次"
},
{
"dose": 1,
"drugName": "四季感冒灵",
"num": 1,
"perNum": "1",
"perUnit": "包",
"spec": "2",
"unit": "盒",
"usage": "口服",
"usageFrequencyCode": 1,
"usageFrequencyName": "每天三次"
}
],
"storeName": "测试店",
"symptom": "感冒"
}
],
"size": 1,
"startRow": 1,
"total": 1
}
}