Jackson Annotations 基本用法

一、重命名属性

Java代码   收藏代码
  1. public class Name {  
  2.   @JsonProperty("firstName")  
  3.   public String _first_name;  
  4. }  
public class Name {
  @JsonProperty("firstName")
  public String _first_name;
}

 结果是:

Java代码   收藏代码
  1. "firstName" : "Bob" }  
{ "firstName" : "Bob" }

 二、忽略属性

Java代码   收藏代码
  1. public class Value {  
  2.   public int value1;  
  3.   @JsonIgnore   
  4.   public int value2;  
  5. }  
public class Value {
  public int value1;
  @JsonIgnore 
  public int value2;
}

 结果是:

Java代码   收藏代码
  1. "value1" : 42 }  
{ "value1" : 42 }

 ①当由json字符串反序列化成pojo时,如果想忽略json字符串中的某些属性这样处理:

Java代码   收藏代码
  1. @JsonIgnoreProperties({ "extra""uselessValue" })  
  2. public class Value {  
  3.   public int value;  
  4. }  
@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
  public int value;
}

 这样就可以把下面的json字符串反序列化成 Value 对象:

Java代码   收藏代码
  1. "value" : 42"extra" : "fluffy""uselessValue" : -13 }  
{ "value" : 42, "extra" : "fluffy", "uselessValue" : -13 }

 ②若反序列化时要忽略所有pojo中不存在的属性可以这样:

Java代码   收藏代码
  1. @JsonIgnoreProperties(ignoreUnknown=true)  
  2. public class PojoWithAny {  
  3.   public int value;  
  4. }  
@JsonIgnoreProperties(ignoreUnknown=true)
public class PojoWithAny {
  public int value;
}

 三、指定属性类型

有时候属性的类型并不是你想要的,比如以下情况:

  • 反序列化的时候,声明的类型是一个通用类型,但是你知道应该对应哪个具体的实现类。
  • 序列化时,你可能不需要一个类的全部属性,只是想要它的父类的属性。

这样处理就可以了:

Java代码   收藏代码
  1. public class ValueContainer {  
  2.   // 尽管这个属性是 Value 类型,  
  3.   // 但是你想在反序列化时将json字符串读取成ValueImpl 类型  
  4.   @JsonDeserialize(as=ValueImpl.class)  
  5.   public Value value;  
  6.   
  7.   // 如果你将BasicType的子类AdvancedType的一个对象赋值给这个属性  
  8.   // 但是你又想按照BasicType类型来序列化  
  9.   //(默认是按照属性的运行时类型,即AdvancedType序列化)  
  10.   
  11.   @JsonSerialize(as=BasicType.class)  
  12.   // 或者用 @JsonSerialize(typing=Typing.STATIC)  
  13.   public BasicType another;  
  14. }  
public class ValueContainer {
  // 尽管这个属性是 Value 类型,
  // 但是你想在反序列化时将json字符串读取成ValueImpl 类型
  @JsonDeserialize(as=ValueImpl.class)
  public Value value;

  // 如果你将BasicType的子类AdvancedType的一个对象赋值给这个属性
  // 但是你又想按照BasicType类型来序列化
  //(默认是按照属性的运行时类型,即AdvancedType序列化)

  @JsonSerialize(as=BasicType.class)
  // 或者用 @JsonSerialize(typing=Typing.STATIC)
  public BasicType another;
}

 四、使用构造器或工厂方法

①Jackson默认使用无参的默认构造器来创建实例,但是也可以使用其他构造器或者静态的工厂方法来创建实例。

Java代码   收藏代码
  1. public class CtorPOJO {  
  2.    private final int _x, _y;  
  3.   
  4.    @JsonCreator  
  5.    public CtorPOJO(@JsonProperty("x"int x, @JsonProperty("y"int y) {  
  6.       _x = x;  
  7.       _y = y;  
  8.    }  
  9. }  
public class CtorPOJO {
   private final int _x, _y;

   @JsonCreator
   public CtorPOJO(@JsonProperty("x") int x, @JsonProperty("y") int y) {
      _x = x;
      _y = y;
   }
}

 ②静态的工厂方法也是同样的用法。但是还有一个被称作“委托”的另类用法:

Java代码   收藏代码
  1. public class DelegatingPOJO {  
  2.    private final int _x, _y;  
  3.   
  4.    @JsonCreator  
  5.    public DelegatingPOJO(Map<String,Object> delegate) {  
  6.       _x = (Integer) delegate.get("x");  
  7.       _y = (Integer) delegate.get("y");  
  8.    }  
  9. }  
public class DelegatingPOJO {
   private final int _x, _y;

   @JsonCreator
   public DelegatingPOJO(Map<String,Object> delegate) {
      _x = (Integer) delegate.get("x");
      _y = (Integer) delegate.get("y");
   }
}

 这种用法只能有一个参数,而且不能带@JsonProperty注解。

五、修改属性自动检测

Jackson默认的属性检测规则是这样的:

  • 所有的 public 类型的属性
  • 所有的 public 类型的 get 方法
  • 所有的 set 方法(无论方法的可见性)

如果默认规则不能满足需求,可以用@JsonAutoDetect注解来改变。

①比如想要自动检测到所有属性(无论该属性的可见性)

Java代码   收藏代码
  1. @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)  
  2. public class POJOWithFields {  
  3.   private int value;  
  4. }  
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
public class POJOWithFields {
  private int value;
}

 ②想要跳过所有方法

Java代码   收藏代码
  1. @JsonAutoDetect(getterVisibility=JsonAutoDetect.Visibility.NONE)  
  2. public class POJOWithNoMethod {  
  3.   
  4. }  
@JsonAutoDetect(getterVisibility=JsonAutoDetect.Visibility.NONE)
public class POJOWithNoMethod {

}

 ③两个加在一起就是只检测属性不检测方法了(鄙人就是为了这个才去读了官方文档的)

 

Java代码   收藏代码
  1. @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE)  
  2. public class POJOWithOnlyField {  
  3.   
  4. }  
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE)
public class POJOWithOnlyField {

}

 

基本使用就这些了。英文原文看这里:原文地址。Jackson全部注解看这里:Jackson注解大全

 

 

 

 

 

      

 

http://blog.csdn.net/nomousewch/article/details/8949899

http://wong-john.iteye.com/blog/1753402

                                           http://bbs.jee-soft.cn:8086/showtopic-156.aspx

jackson注解

Jackson(http://jackson.codehaus.org)库是基于Java语言的开源json格式解析工具,相对于javajson解析的其他库,诸如json-lib、gson包,Jackson具有以下优点:

功能全面,提供多种模式的json解析方式,“对象绑定”使用方便,利用注解包能为我们开发提供很多便利。

性能较高,“流模式”的解析效率超过绝大多数类似的json包。

jackson-core.jar——核心包(必须),提供基于“流模式”解析的API。

核心包:JsonPaser(json流读取),JsonGenerator(json流输出)。

jackson-databind——数据绑定包(可选),提供基于“对象绑定”和“树模型”相关API。

数据绑定包:ObjectMapper(构建树模式和对象绑定模式),JsonNode(树节点)。

jackson-annotations——注解包(可选),提供注解功能。

jackson-datatype-joda-2.1.5.jar——日期转换

Jackson注解

@JsonIgnoreProperties

类注解, 作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。用法很简单@JsonIgnoreProperties({"property1","property2"}),hibernate延时加载

因为jsonplugin用的是java的内审机制.hibernate会给被管理的pojo加入一个 hibernateLazyInitializer属性,jsonplugin会把hibernateLazyInitializer也拿出来操作,并读取里面一个不能被反射操作的属性就产生了这个异常,可以用annotation来排除hibernateLazyInitializer这个属性。

@JsonIgnore

作用于属性或字段上,用来表明,当生成json的时候忽略有该annotation的方法或字段

@JsonProperty("firstName")

作用于属性或字段上,重命名

 

@JsonFormat

作用于属性或者字段上,方便的把Date类型直接转化为我们想要的模式,如@JsonFormat(pattern ="yyyy-MM-dd HH-mm-ss")

 

@JsonSerialize

作用于属性或者字段上,指定序列化方式

@JsonSerialize(as=BasicType.class)

将类型序列化成指定类型

@JsonSerialize(using=CustomDoubleSerialize.class)

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

@JsonSerialize(using= CustomDoubleSerialize.class) 

publicclass CustomDateDeserialize extends JsonDeserializer<Date> {

         private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

         public Date deserialize(JsonParser jp,DeserializationContext ctxt)

                            throws IOException,JsonProcessingException {

                   Date date = null;

                   try {

                            date =sdf.parse(jp.getText());

                   } catch (ParseException e) {

                            e.printStackTrace();

                   }

                   return date;

         }

}

 

@JsonDeserialize

作用于属性或者字段上,指定反序列化方式

@JsonDeserialize(as=ValueImpl.class)

将类型反序列化成指定类型

@JsonDeserialize(using= CustomDateDeserialize.class)

用于在反序列化时嵌入我们自定义的代码

publicclass CustomDateDeserialize extends JsonDeserializer<Date> {

         private SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd");

         @Override

         public Date deserialize(JsonParser jp,DeserializationContext ctxt)

                            throws IOException,JsonProcessingException {

                   Date date = null;

                   try {

                            date =sdf.parse(jp.getText());

                   } catch (ParseException e) {

                            e.printStackTrace();

                   }

                   return date;

         }

}

 

@JsonCreator

作用于使用构造器方法或工厂方法 ,指定反序列化时创建实例方式(默认使用无参数构造器)

采用构造器方式

publicclass MyBean {

  private int value;

  @JsonCreator

  publicMyBean(@JsonProperty("value") int v) {

    this.value = v;

  }

  public int getValue() { return value; }

}

使用相同的方式,可以将@JsonCreator用在静态工厂方法上

不过,还有一个可选的替代方案,被称作“授权式”构建器(“delegating” creator):

publicclass DelegatingPOJO {

   private final int _x, _y;

   @JsonCreator

   publicDelegatingPOJO(Map<String,Object> delegate) {

      _x = (Integer)delegate.get("x");

      _y = (Integer)delegate.get("y");

   }

}

 

@JsonTypeInfo

类注解,当输出操作的对象拥有多个子类型且在反序列化时需要添加子类对象的类型信息,使用此注解可以正确地设置子类对象的类型

@JsonTypeInfo(use=Id.CLASS,include=As.PROPERTY,property=”class”)

子类类型作为属性,属性名为class

"animals": [ {

    "class" :"jackson.Lion",

    "name" : "Simba",

    "sound" : "Roar",

    "type" : "carnivorous",

    "endangered" : true

}]

@JsonTypeInfo(use=Id.CLASS,include= As.WRAPPER_OBJECT)

"animals": [ {

    "jackson.Lion" : {

      "name" : "Simba",

      "sound" : "Roar",

      "type" :"carnivorous",

      "endangered" : true

    }

 }]

这个注解还有很多配置可以进行设置

 

@JsonAutoDetect

类注解,指定属性发现规则

Jackson默认的属性发现规则将会查找到如下所述的属性:

•所有被public修饰的字段(成员变量);

•所有被public修饰的getter(即形如“getXxx()”的方法);

•所有被public修饰的setter(即形如“setXxx(value)”的方法)

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)

更多注解查看http://wiki.fasterxml.com/JacksonAnnotations 

猜你喜欢

转载自weitao1026.iteye.com/blog/2374071
今日推荐