使用情景,在对接别的平台的数据的时候,要将数据存到自己的数据库中,所以将json转成对象存储。
但过程中又有个问题,返回的字段有100多个,而我只需要5个字段值。所以单纯的JSONObject.toBean()不能处理JSON中多余的为NULL值的字段。
一、使用JSONObject.toBean()方法来转换对象
1.引入依赖
<!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
2.代码
public static void main(String[] args) {
JSONObject jsonObj = HTTP请求返回的json;
Map<String, Class> classMap = new HashMap<>();
//data 与list 是json相关结构
classMap.put("data", Date.class);
classMap.put("list", DateList.class);
Result result = (Result)JSONObject.toBean(jsonObj, Result.class, classMap);
System.out.println(result.getData().getList());
}
Result .class——
@Entity
@Data
public class Result {
private static final long serialVersionUID = -56146797899019685L;
@Id
private String code;
private String errorMsg;
@Transient
private LanchengiotDate data;
}
Date.class——
@Entity
@Data
public class Date {
private static final long serialVersionUID = -56146797899019685L;
@Id
private Integer pageNum;
private Integer pageSize;
private Integer size;
private Integer total;
private Integer pages;
@Transient
private List<DateList> list;
}
DateList.class——
@Entity
@Data
public class DateList{
private static final long serialVersionUID = -56146797899019685L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@ApiModelProperty("主键ID")
@Column(name = "id")
private String id;
@ApiModelProperty("名称")
@Column(name = "name")
private String name;
@ApiModelProperty("社区名称")
@Column(name = "community")
private String community;
}
json格式如下——
{
"code": "200",
"errorMsg": "SUCCESS",
"data": {
"pageNum": 3,
"pageSize": 10,
"size": 10,
"total": 142,
"pages": 15,
"list": [
……
],
[
……
]
}
}
——————————————————分割线————————————————————————————
上面就是Json字符串直接转换为对象的方法,但存在限制,DateList.class对象中的字段要与json的属性相匹配,换言之,json中字段有Null值,而对象没有这个属性,就会报错。所以在需要的字段较少的情况下,使用如下方法——
public static void main(String[] args) {
JSONObject jsonObj = HTTP请求返回的json;
Map<String, Class> classMap = new HashMap<>();
//划重点,list没有了!为了不与结构匹配上!
classMap.put("data", Date.class);
Result result = (Result)JSONObject.toBean(jsonObj, Result.class, classMap);
System.out.println(result.getData().getList());
//jsonstr 是String 类型的,内部嵌套了 List,Map 等类型的话,会转成MorphDynaBean对象
//Date.class 中也要以 List<MorphDynaBean> 接收
List<MorphDynaBean> jsonList = result.getData().getList();
//然后循环赋值
for (int i = 0; i < jsonList.size(); i++) {
DateList list = new DateList();
list.setId(jsonList.get(i).get("id").toString());
list.setAreaName(jsonList.get(i).get("name").toString());
list.setCommunity(jsonList.get(i).get("community").toString());
System.out.println(list);
}
}