不管是将json转化为JavaBean,还是将JavaBean转化为json,都要保证json字符串中的属性名和java对象中的字段名一致,否则对于名字不一致将不会映射成功。本文将分篇来介绍json和JavaBean之间的互相转化。

一.将json转化为JavaBean。

假设有一json字符串如下:

jsonString={
id : "",
time: "2016-07-23",
}

假设有一javaBean如下:

public class TicketBean{
private int id;
private String time;
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getTime(){
return tiem;
}
public void setTime(String time){
this.time= time;
}
}
ObjectMapper mapper = new ObjectMapprt();
TicketBean ticketBean = mapper.readValue(jsonString,TicketBean.class);

执行完上面的代码,我们会得到一个TicketBean对象,这个对象的字段id=0,time="2016-07-23"。可以看到json字符串中id对应的值是空,为什么映射成JavaBean时,id字段就变为0了呢。原来我们在JavaBean中将id声明int型了,int型的默认值是0。

上面说的都是正常的情况。除此之外还有两种经常遇见的情况。第一种就是json字符串中比javaBean对象多了几个字段,第二种情况就是json字符串中比javaBean对象少了几个字段。

1.对于json字符串比javaBean对象少几个字段这种情况,直接映射不会有太大的问题。需要注意的是,映射以后,多出来的几个字段会被赋一个null值。

2.对于json字符串比javaBean对象多几个字段这种情况,直接映射就会出错了。

解决办法是在开始映射之前,对ObjectMapper对象做一点配置。

mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);

这句代码的意思是:在反序列化时,遇到未知属性是否引起结果失败。默认是true,现在我么把它设置为false。这样在遇到未知属性的时候就不会报错。除了这种方法以外,还可以采用注解的方式。在类上加上注解@JsonIgnoreProperties(ignoreUnknown = true)。可以达到同样的效果。

二.将javaBean转化为json

假设有一javaBean如下:

public class TicketBean{
private int id;
private String time;
private String name;
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getTime(){
return time;
}
public void setTime(String time){
this.time= time;
}
public String getName(){
retrun name;
}
public void setName(String name){
this.name = name;
}
}
TicketBean ticketBean = new TicketBean();
ticketBean.setName("jack");
ticketBean.setId(1);
ObjectMapper mapper = new ObjectMapprt();
String jsonString = mapper.writeValueAsString(ticketBean);

执行完上面的代码,会得到这样一个json字符串:

jsonString = {
"id" : 1,
"name": "jack",
"time": null
}

我们可以看到,因为我们没有对time字段赋值,而time是String类型,String类型的默认值是null。假如我们想让为NULL的属性不参与序列化,该怎么办呢?

在调用mapper对象的writeValueAsString()方法前,加上mapper.setSerializationInClusion(Include.NON_NULL);就可以了。