目录

什么是Jackson

Jackson是一款不错的Java语言实现的JSON解析器和生成器,通过Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。

常用注解

排除属性

@JsonIgnore,一般标记在属性或方法上;作用于序列化与反序列化;

@JsonIgnoreProperties,如果是代理类,由于无法标记在属性或方法上,所以,可以标记在类声明上;也作用于反序列化时的字段解析;

有时POJO包括了一些你不希望输出的属性,在这种情况下,你可以进行如下操作:

public class Value {  
  public int value;  
  @JsonIgnore
  public int internalValue;  
}  

这时得到的JSON数据结果如下:

{ "value" : 42 }

你如果想忽略掉某些从JSON数据中得到的属性,你可以这样:

@JsonIgnoreProperties({ "extra", "uselessValue" })  
public class Value {  
  public int value;
  public String extra;
  public int uselessValue;
}  

这样就能够处理像如下所示的JSON数据:

{ "value" : 42}

你甚至能简单地忽略掉从JSON(由于在应用中没有完全匹配的POJO)中获得的所有“多余的”属性。你可以通过添加如下代码完成这个操作:

@JsonIgnoreProperties(ignoreUnknown=true)  
public class PojoWithAny {  
  public int value;  
}  

忽略属性

@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性;

如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架默认其注解为@Basic

//表示该字段在数据库表中没有
@Transient
public int getAge() {
 return 1+1;
}

属性别名(属性重命名时使用的注解)

@JsonProperty,序列化/反序列化都有效;最常见的使用方式之一就是改变某个成员属性所使用的JSON名称,例如:

public class Name {  
  @JsonProperty("firstName")  
  public String _first_name;  
}  

将会生成如下所示的JSON数据结果:
{ "firstName" : "Bob" }

而不是:
{ "_first_name" : "Bob"}

此外@JsonProperty还可以用来设置属性的读写,示例:

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;

password属性就只能写入,不会显示出来。此外还有WRITE_READ、READ_ONLY等属性。

日期格式化

@JsonFormat,此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如:

@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")
private Date createDate = DateUtil.parseFormat( yyyy-MM-dd );

嵌入自定义代码

@JsonSerialize

此注解用于属性或者getter方法上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。

@JsonDeserialize

此注解用于属性或者setter方法上,用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize

属性排序

@JsonPropertyOrder,注释在类声明中。

父/子关联

@JsonBackReference@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。

@JsonBackReference标注的属性在序列化(serialization,即将对象转换为json数据)时,会被忽略(即结果中的json数据不包含该属性的内容)。

@JsonManagedReference标注的属性则会被序列化。

@OneToMany(mappedBy = "flowStep")
@JsonManagedReference
private List<FlowStepResource> flowStepResourceList;
@ManyToOne
@JoinColumn(name = "flow_step_id")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@JsonBackReference
private FlowStep flowStep;

其它

注意:在使用hibernate的时候,查询数据库后产生的实体类是个代理类,这时候转换JSON会报错;

解决方法有两种:

1)设置FAIL_ON_EMPTY_BEANS属性,告诉Jackson空对象不要抛异常;

mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);

2)使用@JsonIgnoreProperties注解

在实体类声明处加上@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})注解;

建议使用@JsonIgnoreProperties注解,这样生成的JSON中不会产生多余的字段;