转: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. 在点击div中的p时,如何阻止事件冒泡?

    今天整理笔记,发现在学习javaScript的过程中,遇到过一个在当时看来很棘手的问题,现在特地总结一下,也希望能帮助到曾像我一样迷惘的初学者. 我还是以一个案例来说明问题,html代码如下: < ...

  2. 如何用CSS进行网页布局---学习总结

    页面布局:对页面的文字.图形或表格进行格式设置.包括字体.字号.颜色纸张大小和方向以及页边距等 页面布局分为4种: 一栏布局 两栏布局 三栏布局 混合布局 灵活利用float.position对页面进 ...

  3. 免越狱tweak应用逆向开发

    对于已越狱的设备,系统默认安装了mobilesubstrate动态库,提供一个系统级的入侵管道,所有的tweak都可以依赖它来进行开发.而对于没有越狱的手机,我们需要向目标app注入libsubstr ...

  4. PLSQL DEVELOPER 使用的一些技巧【转】

    1.登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如果你登录的用户是dba,要展开tables目录,正常情况都需 ...

  5. esri-leaflet入门教程(2)-地图的HelloWorld

    esri-leaflet入门教程(2)-地图的HelloWorld by 李远祥 常言道"君子性非异也,善假于物也".这句话在IT界同样也适用,只不过IT界有更为时髦的说法:&qu ...

  6. android Android性能优化之如何避免Overdraw

    什么是Overdraw? Overdraw就是过度绘制   怎么来消灭overdraw呢?总的原则就是:尽量避免重叠不可见元素的绘制,基于这个原则,我们大概可以想出以下几招: 第一招:合理选择控件容器 ...

  7. iOS详解MMDrawerController抽屉效果(一)

      提前说好,本文绝对不是教你如何使用MMDrawerController这个第三方库,因为那太多人写了 ,也太简单了.这篇文章主要带你分析MMDrawerController是怎么实现抽屉效果,明白 ...

  8. 移动端touch实现下拉刷新

    移动端实现下拉刷新 第一部分:四个touch事件 1.touchstart:只要将手指放在了屏幕上(而不管是几只),都会触发touchstart事件. 2.touchmove: 当我们用手指在屏幕上滑 ...

  9. 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想

    菜鸟D在项目中遇见一个比较纠结的高耦合,所以就想办法来解耦.情况是这样的:系统通过用户选择treeview控件的节点判断调用不同的处理,这些处理中某些东西又是类似的.同事的建议是采用简单工厂,耦合就耦 ...

  10. Java显式锁学习总结之二:使用AbstractQueuedSynchronizer构建同步组件

    Jdk1.5中包含了并发大神Doug Lea写的并发工具包java.util.concurrent,这个工具包中包含了显示锁和其他的实用同步组件.Doug Lea在构建锁和组件的时候,大多是以队列同步 ...