[Java] jackson注解

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

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

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

jackson主要的包

jackson-core——核心包(必须),提供基于“流模式”解析的API。核心包:JsonPaser(json流读取),JsonGenerator(json流输出)。

jackson-databind——数据绑定包(可选),提供基于“对象绑定”和“树模型”相关API。数据绑定包:ObjectMapper(构建树模式和对象绑定模式),JsonNode(树节点)。

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

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

Jackson注解

1. 重命名属性,忽略属性,以及修改属性所使用的类型。

① 属性重命名时使用的注解

最常见的使用方式之一就是改变某个成员属性所使用的JSON名称。例如: class Name { @JsonProperty("firstName") public String _first_name; }

②忽略属性使用的注解

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

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

或者,你可能忽略掉某些从JSON数据中得到的属性,如果是这样,你可以使用:
@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
  public int value;
}

或者,更粗暴点的,忽略掉从JSON(由于在应用中没有完全匹配的POJO)中获得的所有“多余的”属性。

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

choose more/less specific types 时使用的注解

在有些情况下,Jackson在读入或输出一个成员属性时,所选用的类型(type)可能并不是你想要的

@JsonSerialize(as=BasicType.class) 将类型序列化成指定类型

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

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

@JsonDeserialize(as=ValueImpl.class) 将类型反序列化成指定类型

@JsonDeserialize(using= CustomDateDeserialize.class) 用于在反序列化时嵌入我们自定义的代码

2. 使用构造器或工厂方法

在默认情况下,当由JSON数据创建相应类的实例时,Jackson尝试使用该类的“默认”构造器(即无参数构造器)。不过,你可以选择使用其他的构造器,或者一个静态工厂方法,来创建实例。完成这个操作,你需要使用@JsonCreator注解,有可能还需要使用@JsonProperty注解给参数(arguments)绑定名称。

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");
   }
}

不同之处在于,构建器方法只能有一个参数,而且参数一定不要(must NOT)添加@JsonProperty注解。

3. 处理多态类型

如果你要进行读取、输出操作的对象拥有许多可能的子类型(即表现出多态性),你可能还需要添加一些类型信息。Jackson在反序列化时(读取JSON数据,生成相应的对象)需要这些信息,以便能正确地读取对象的类型。我们可以通过在“基本类型”上添加@JsonTypeInfo注解来完成操作:

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

@JsonTypeInfo(use=Id.CLASS,include=As.PROPERTY,property=”class”) 子类类型作为属性,属性名为class

// 将Java类的名称(“com.myempl.ImplClass”)存储到JSON的一个名称为“class”的属性中

@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY,property=”class”)public abstract class BaseClass {}

public class Impl1 extends BaseClass {  public int x;}

public class Impl2 extends BaseClass {  public String name;}

public class PojoWithTypedObjects {  public List<BaseClass> items;}

items序列化之后的结果类似:

{“items” : [
  {“class”:”Impl2”,  “name”: “Bob”},
  {“class”:”Impl1”, :”x” : 13}
]}

4. 重新设置属性的自动发现(Changing property auto-detection)

@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

原文:http://blog.csdn.net/ljhabc1982/article/details/17553095

时间: 2024-10-22 07:45:32

[Java] jackson注解的相关文章

自己写的基于java Annotation(注解)的数据校验框架

JavaEE6中提供了基于java Annotation(注解)的Bean校验框架,Hibernate也有类似的基于Annotation的数据校验功能,我在工作中,产品也经常需要使 用数据校验,为了方便和重用,自己写了一个简单的基于Annotation的校验框架.有兴趣的可以扩展. 框架说明: AnnotationValidable接口:所有需要使用该校验框架的类都要实现它,该类中没有任何方法需要实现,仅仅是一个表明那些类需要使用该校验框架的标识. GetFiledValue类:是一个工具类,对

深入理解Java:注解(Annotation)--注解处理器

深入理解Java:注解(Annotation)--注解处理器 如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器. 注解处理器类库(java.lang.reflect.AnnotatedElement): Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口.除此之外,Java在java.l

深入理解Java:注解(Annotation)自己定义注解入门

深入理解Java:注解(Annotation)自己定义注解入门 要深入学习注解.我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前.我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其它注解. Java5.0定义了4个标准的meta-annotation类型.它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected], [email protected], [email pro

第17篇-JAVA Annotation 注解

第17篇-JAVA Annotation 注解 每篇一句 :真的努力后你会发现自己要比想象的优秀很多 初学心得: 怀着一颗奋斗不息的心,一切困苦艰辛自当迎刃而解 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-17| JAVA Annotation注解 ] 1.什么是注解(Annotation) Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行.在Java技术

Java Annotation 注解

java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin: 0 0 10px; padding: 8px 10px 0; font: 13.34px/1.4 helvetica, arial, freesans, clean, sans-serif; width: 452px; background-color: #fff } div.oembedall

java自定义注解类

一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Tar

Java Annotation注解

参考:Java官方文档http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.6 注解类型: 是一种特殊类型的interface,区别在于注解声明是 @interface 特点: 1.java的注解不可显式声明父类(实际上他们都继承了Annotation类,但是你在声明时无法使用extends 关键字),也无法被泛化. 2.方法: a) 每个方法都定义了该注解中的一个元素(Each method declaration

Java中注解

Java中Annotation其实就是代码里的特殊标记,它可以用来代替配置文件 自定义注解的步骤: 1.编写注解类: 使用@interface 定义 package cn.cqu.huang; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.

[2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.J