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

以下内容摘录、翻译自https://github.com/FasterXML/jackson-annotations 
(1)初级 
我们从几个简单的使用场景开始:重命名属性,忽略属性,以及修改属性所使用的类型。 
注意:下面的例子仅仅显示了成员属性(field properties),注解同样也可以用在成员方法(getter/setter)上。 
①属性重命名时使用的注解 
最常见的使用方式之一就是改变某个成员属性所使用的JSON名称,例如: 

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


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

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

②忽略属性时使用的注解 
有时POJO包括了一些你不希望输出的属性,在这种情况下,你可以进行如下操作: 
public class Value { 
  public int value; 
  @JsonIgnore public int internalValue; 


这时得到的JSON数据结果如下: 
{ "value" : 42 } 

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


这样就能够处理像如下所示的JSON数据: 
{ "value" : 42, "extra" : "fluffy", "uselessValue" : -13 } 

最后,你甚至能简单地忽略掉从JSON(由于在应用中没有完全匹配的POJO)中获得的所有“多余的”属性。你可以通过添加如下代码完成这个操作: 
@JsonIgnoreProperties(ignoreUnknown=true) 
public class PojoWithAny { 
  public int value; 


③选择更多/更少(more/less)指定类型(specific types)时使用的注解 
在有些情况下,Jackson在读入或输出一个成员属性时,所选用的类型(type)可能并不是你想要的: 
•当读取(反序列化)时,声明的类型(declared type)可能是一个基本类型(general type),但是你确切地知道应该使用的实现类型(译注:也就说,我们需要反序列化后生成的对象是实现类型的); 
•当输出(序列化)时,Jackson默认使用的是给定的运行时类型(the specific runtime type);但是你可能不想输出那个类型的所有信息,而仅仅是它的父类型所囊括的信息。 
在这些应用场景,你可以使用如下的注解进行处理: 
public class ValueContainer { 
  // 虽然代码中使用的类型(type)是'Value', 但我们希望读取到的JSON 之后得到的对象的类型是'ValueImpl' 
  @JsonDeserialize(as=ValueImpl.class) 
  public Value value; 

  // 虽然运行时的类型(type)可能是'AdvancedType'(高级类型), 但是我们确实想序列化 
  // 成为'BasicType'(基础类型); 有两种处理方式: 
  @JsonSerialize(as=BasicType.class) 
  // 或者我们可以这样: @JsonSerialize(typing=Typing.STATIC) 
  public BasicType another; 


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

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


使用相同的方式,可以将@JsonCreator用在静态工厂方法上。不过,还有一个可选的替代方案,被称作“授权式”构建器(“delegating” creator): 

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


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

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


这样,序列化之后的JSON格式如下: 
{“items” : [ 
{“class”:”Impl2”,  “name”: “Bob”}, 
{“class”:”Impl1”, :”x” : 13} 
]} 

注意:这个注解还有很多配置可以进行设置,详细内容请查阅浏览: 
• Javadocs 
• 多态类型处理简介I(ntro to polymorphic type handling) 

③重新设置属性的自动发现(Changing property auto-detection) 
Jackson默认的属性发现规则将会查找到如下所述的属性: 
•所有被public修饰的字段(成员变量); 
•所有被public修饰的getter(即形如“getXxx()”的方法); 
•所有被public修饰的setter(即形如“setXxx(value)”的方法),不管可见或不可见。 
不过如果这样也不行,你可以通过使用使用注解@JsonAutoDetect来改变可见级别。如果你想自动发现所有的字段(就像GSON包所进行的操作那样),你可以这样做: 
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY) 
public class POJOWithFields { 
private int value; 

或者,你想禁用对所有字段的自动发现: 
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE) 
public class POJOWithNoFields { 
//不会被序列化,除非再有一个可以访问的“getValue”方法 
public int value; 


拓展阅读: 
•列举出的所有可用的Jackson注解 
•文档 
相关内容: 
• 数据绑定 模块拥有更多文档内容,毕竟它是注解的主要使用者。另外,这里有一些其他有用的链接: 
Jackson项目主页 
o FasterXML Wiki中的注解文档 ,涵盖了1.x和2.0的注解。 
更多Jackson使用教程等详细内容,请参见http://wiki.fasterxml.com/JacksonHome。

Jackson注解学习参考(转)的更多相关文章

  1. jackson 注脚学习参考

    (1)初级我们从几个简单的使用场景开始:重命名属性,忽略属性,以及修改属性所使用的类型.注意:下面的例子仅仅显示了成员属性(field properties),注解同样也可以用在成员方法(getter ...

  2. 转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable

    转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariab ...

  3. Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable (转)

    最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...

  4. Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable(转)

    最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...

  5. JackSon fasterxml学习

    概述 Jackson框架是基于Java平台的一套数据处理工具,被称为"最好的JavaJson解析器".  Jackson框架包含了3个核心库:streaming,databind, ...

  6. [Java] jackson注解

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

  7. Mongoose学习参考文档——基础篇

    Mongoose学习参考文档 前言:本学习参考文档仅供参考,如有问题,师请雅正 一.快速通道 1.1 名词解释 Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model ...

  8. 【转】Spring 注解学习手札(超好的springmvc注解教程)

    Spring 注解学习手札(一) 构建简单Web应用 Spring 注解学习手札(二) 控制层梳理 Spring 注解学习手札(三) 表单页面处理 Spring 注解学习手札(四) 持久层浅析 Spr ...

  9. jackSon注解– @JsonInclude 注解不返回null值字段

    @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class OrderDTO { private String orderId; @Js ...

随机推荐

  1. ADXL345经验总结,采用SPI和I2C总线操作

    一. ADXL345简介       ADXL345是ADI公司推出的三轴(x,y,z)iMEMS数字加速度计(digital accelerometer),具有在16G下高分辨率(13Bit)测量能 ...

  2. iOS initWithFrame、initWithCoder、awakeFromNib的区别解析

    当我们需要自定义一个View控件时,会有 initWithFrame.initWithCoder.awakeFromNib 这三个系统方法,关于这三个方法何时调用,如何调用,有时候可能很多人会弄混淆. ...

  3. Fourier分析基础(一)——Fourier级数

    前言 傅立叶分析的作用是把一个函数变成一堆三角函数的和的形式,也就是分解.首先引入的是傅立叶级数,Fourier级数的作用是把函数变为可数无限个三角函数的和,而且这些三角函数的频率都是某个基频的整数倍 ...

  4. date()中的getYear的小问题

    function DateDemo(){ var d,s = "今天得日期是:"; d = new Date(); s += d.getMonth()++"/" ...

  5. (@WhiteTaken)设计模式学习——工厂方法模式

    这个工厂方法模式,是简单工厂的延伸,不同点在于,将某个具体的类继续细分,将核心部分抽象成一个接口.而简单工厂,把核心写在了一个类上,不利于拓展. 举个例子,简单工厂中有苹果类,香蕉类,我们创建了一个F ...

  6. windows visual studio 2015安装

    下载 首先到微软官方下载在线安装文件 https://www.microsoft.com 运行安装 点击运行后选择 自定义 选择安装功能,把sql server去掉,是数据库插件 点击下一步,中途会提 ...

  7. Vuex 模块化与项目实例 (2.0)

    Vuex 强调使用单一状态树,即在一个项目里只有一个 store,这个 store 集中管理了项目中所有的数据以及对数据的操作行为.但是这样带来的问题是 store 可能会非常臃肿庞大不易维护,所以就 ...

  8. PrintWriter用法简析

    public class PrintWriterextends Writer 向文本输出流打印对象的格式化表示形式.此类实现在 PrintStream 中的所有 print 方法.它不包含用于写入原始 ...

  9. CI Weekly #14 | 如何搭建合适的持续交付开发流程?

    时隔 10 个月,flow.ci 开始正式收费上线.为感谢对我们的内测支持,所有内测用户可继续免费使用基础版 30 天,截止至 3 月 15 日失效.欢迎随时告诉我们你对收费版 flow.ci 的反馈 ...

  10. 继BAT之后 第四大巨头是谁

    中国互联网三大巨头的位置,毫无疑问是属于百度腾讯阿里的,但在它们之后,哪家公司能进巨头之列?京东布局不错,走亚马逊路线:360同时占据传统和移动互联网两大领域入口:小米软硬整合,生态系统完整. 很多人 ...