Jackson注解详解


Jackson注解详解

文章插图
 
1. 概述在本文中,我们将深入研究Jackson注解 。
我们将看到如何使用现有的注释,如何创建自定义的注释,最后—如何禁用它们 。
2. Jackson序列化注解首先,我们将查看序列化注释 。
2.1. @JsonAnyGetter@JsonAnyGetter注释允许灵活地使用映射字段作为标准属性 。
下面是一个快速的例子——ExtendableBean实体拥有name属性和一组可扩展属性,它们以键/值对的形式存在:
public class ExtendableBean {public String name;private Map<String, String> properties;@JsonAnyGetterpublic Map<String, String> getProperties() {return properties;}}当我们序列化这个实体的一个实例时,我们会得到Map中所有的键值作为标准的普通属性:
{"name":"My bean","attr2":"val2","attr1":"val1"}这里是如何序列化这个实体看起来像在实践:
@Testpublic void whenSerializingUsingJsonAnyGetter_thenCorrect()throws JsonProcessingException {ExtendableBean bean = new ExtendableBean("My bean");bean.add("attr1", "val1");bean.add("attr2", "val2");String result = new ObjectMApper().writeValueAsString(bean);assertThat(result, containsString("attr1"));assertThat(result, containsString("val1"));}我们还可以使用可选参数enabled为false来禁用@JsonAnyGetter() 。在本例中,映射将被转换为JSON,并在序列化之后出现在properties变量下 。
2.2. @JsonGetter@JsonGetter注释是@JsonProperty注释的替代品,它将方法标记为getter方法 。
在下面的例子中-我们指定getTheName()方法作为MyBean实体的name属性的getter方法:
public class MyBean {public int id;private String name;@JsonGetter("name")public String getTheName() {return name;}}这是如何在实践中运作的:
@Testpublic void whenSerializingUsingJsonGetter_thenCorrect()throws JsonProcessingException {MyBean bean = new MyBean(1, "My bean");String result = new ObjectMapper().writeValueAsString(bean);assertThat(result, containsString("My bean"));assertThat(result, containsString("1"));}2.3. @JsonPropertyOrder我们可以使用@JsonPropertyOrder注释来指定序列化时属性的顺序 。
让我们为MyBean实体的属性设置一个自定义顺序:
@JsonPropertyOrder({ "name", "id" })public class MyBean {public int id;public String name;}这是序列化的输出:
{"name":"My bean","id":1}还有一个简单的测试:
@Testpublic void whenSerializingUsingJsonPropertyOrder_thenCorrect()throws JsonProcessingException {MyBean bean = new MyBean(1, "My bean");String result = new ObjectMapper().writeValueAsString(bean);assertThat(result, containsString("My bean"));assertThat(result, containsString("1"));}我们还可以使用@JsonPropertyOrder(alphabetic=true)按字母顺序排列属性 。在这种情况下,序列化的输出将是:
{"id":1,"name":"My bean"}2.4. 


    推荐阅读