1. 在mavne中引入net.sf.json-lib的依赖
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
2. 声明要转化类之间的关系
2.1 下拉选项表
package com.shi.po;
/**
* 下拉框选项
*
* authro shijunjun
*/
public class SelectItem {
private String id;
private String name;
private String desc;
public SelectItem(){}
public SelectItem(String id, String name, String desc) {
this.id = id;
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return "SelectItem{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
2.2 选项表
package com.shi.po;
import java.util.List;
/**
* 选项表
* author shijunjun
*/
public class RowItem {
private String id;
private String name;
private String desc;
private List<SelectItem> listSelectItem;
@Override
public String toString() {
return "RowItem{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", desc='" + desc + '\'' +
", listSelectItem=" + listSelectItem +
'}';
}
public RowItem(){}
public RowItem(String id, String name, String desc, List<SelectItem> listSelectItem) {
this.id = id;
this.name = name;
this.desc = desc;
this.listSelectItem = listSelectItem;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public List<SelectItem> getListSelectItem() {
return listSelectItem;
}
public void setListSelectItem(List<SelectItem> listSelectItem) {
this.listSelectItem = listSelectItem;
}
}
2.3 模板
package com.shi.po;
import java.util.List;
/**
* 一个模板类
* author shijunjun
*/
public class Temp {
private String id;
private String name;
private List<RowItem> listRowItem;
@Override
public String toString() {
return "Temp{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", listRowItem=" + listRowItem +
'}';
}
public Temp(){}
public Temp(String id, String name, List<RowItem> listRowItem) {
this.id = id;
this.name = name;
this.listRowItem = listRowItem;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<RowItem> getListRowItem() {
return listRowItem;
}
public void setListRowItem(List<RowItem> listRowItem) {
this.listRowItem = listRowItem;
}
}
2.4 临时表,为了获取Temp的JSONArray对象
package com.shi.po;
import java.util.List;
public class Total {
private String id;
private List<Temp> tempList;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<Temp> getTempList() {
return tempList;
}
public void setTempList(List<Temp> tempList) {
this.tempList = tempList;
}
}
3. 把对象转化为JSON格式的字符串,为了后面的解析。
public String getJSON(){
//1. 生成下拉选项对象
SelectItem item = new SelectItem("1", "北京", "中国的首都");
SelectItem item2 = new SelectItem("2", "上海", "魔都");
List<SelectItem> selectItems = new ArrayList<>();
selectItems.add(item);
selectItems.add(item2);
//2. 生成选项对象
RowItem rowItem = new RowItem("1", "小明", "第一行数据", selectItems);
RowItem rowItem2 = new RowItem("2", "小黑", "第二行数据", null);
List<RowItem> rowItems = new ArrayList<>();
rowItems.add(rowItem);
rowItems.add(rowItem2);
//3. 生成模板对象
Temp temp = new Temp("1", "人员统计", rowItems);
Temp temp2 = new Temp("2", "人员统计2", rowItems);
List<Temp> tempList = new ArrayList<>();
tempList.add(temp);
tempList.add(temp2);
//4. 生成临时total对象
Total total = new Total();
total.setId("1");
total.setTempList(tempList);
//返回JSON格式的字符串
return JSONObject.fromObject(total).toString();
}
执行结果为:
4. 解析获取的JSON格式字符串为JAVA对象
public void test(){
//1. 获取由封装对象传递来的JSON格式字符串
String jsonText = getJSON();
//2. 把JSON格式字符串转化为JSONObject对象
JSONObject jsonObject = JSONObject.fromObject(jsonText);
//3. 获取tempList对应的值,其值为list格式
JSONArray tempList = jsonObject.getJSONArray("tempList");
//4. 创建一个map对象,其key为JSON中需要转化为Java对象的名字,value为需要转化为Java对象的类
Map<String, Class<?>> map = new HashMap<>();
map.put("listRowItem", RowItem.class);
map.put("listSelectItem", SelectItem.class);
//5. 创建JsonConfig对象,并设置其属性
JsonConfig config = new JsonConfig();
//setRootClass中需要传递的是 最外层的封装Java对象
config.setRootClass(Temp.class);
//设置JSON对象里面key对应的Java对象
config.setClassMap(map);
//6. 使用JSONArray.toCollection对JSONArray对象进行转化
List<Temp> temps = (List<Temp>) JSONArray.toCollection(tempList, config);
//7. 输出转化后的对象
for (Temp temp : temps) {
System.out.println(temp);
}
}
运行结果为:
注意:
- 若把JSONArray对象转化为List时使用:
List<Temp> temps = (List<Temp>) JSONArray.toCollection(tempList, Temp.class);
即没有指定内部的Java对象,则会出现下面的情况:
不调用内部的Java对象时不会报错,若对内部的Java对象进行调用则会出现:
原因是没有指定内部的key对应的Java对象导致的。