什么是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中不会产生多余的字段;
Comments (暂无评论)