(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 注脚学习参考的更多相关文章

  1. Jackson注解学习参考(转)

    转:http://wong-john.iteye.com/blog/1753402 以下内容摘录.翻译自https://github.com/FasterXML/jackson-annotations ...

  2. JackSon fasterxml学习

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

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

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

  4. stm32 学习参考(转)

    源:stm32 学习参考 单片机裸机下写一个自己的shell调试器     LWIP_STM32_ENC28J60_NETCONN_TCP_SERVICER(5)     LWIP_STM32_ENC ...

  5. Android repo 学习参考

    /*************************************************************************** * Android repo 学习参考 * 说 ...

  6. 学习参考:《Python语言及其应用》中文PDF+英文PDF+代码

    学习简单的数据类型,以及基本的数学和文本操作,学习用Python内置的数据结构来处理数据: 掌握Python的代码结构和函数的用法:使用模块和包编写大规模Python程序:深入理解对象.类和其他面向对 ...

  7. 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码

    在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...

  8. 学习参考《高性能MySQL(第3版)》中文PDF+英文PDF

    学习mysql数据库时推荐看看mysql 领域的经典之作<高性能mysql(第3版)>,共分为16 章和6 个附录,内容涵盖mysql 架构和历史,基准测试和性能剖析,数据库软硬件性能优化 ...

  9. 学习参考《Python数据分析与挖掘实战(张良均等)》中文PDF+源代码

    学习Python的主要语法后,想利用python进行数据分析,感觉<Python数据分析与挖掘实战>可以用来学习参考,理论联系实际,能够操作数据进行验证,基础理论的内容对于新手而言还是挺有 ...

随机推荐

  1. weborm 简单控件

    Label - 显示文字,编译后是spanLiteral - 显示文字,编译后没有形成元素 只是文字 一般用来输出 js代码内容 TextBox - 文本框 TextMode -普通文本框 singl ...

  2. android中include 的使用讲解

    include的作用就是重复使用同一段代码,提高代码的重用性.具体说就是,通过include 在 某布局 a.xml 中引用 B.xml布局文件,这个b.xml可同时被多个布局同时使用,所以达到了同一 ...

  3. 关于Yaf的一些说明[转Yaf作者]

    关于Yaf的一些说明[转Yaf作者] 说明下,这篇文章转至于yaf作者鸟哥的博文,因为最近在系统的学习Yaf框架,发现了这篇文章,感觉对于了解Yaf框架还是很有用处,所以转过来和大家分享一下 Yaf是 ...

  4. 【原创】-- nfs安装配置及使用,挂载根文件系统

    环境:ubuntu14.04(非虚拟机),OK6410 环境搭建: (1) #sudo apt-get install nfs-kernel-server 如果已经是最新版本了,无需安装 (2) 建立 ...

  5. [转] Linux中启动和停止jar包的运行

    脚本一: startTest.sh内容如下:#!/bin/shjava -jar Test.jar &       #注意:必须有&让其后台执行,否则没有pid生成echo $! &g ...

  6. Android 开源项目维护者宣布退出

    Android开源项目(Android Open Source Project,AOSP)的长期维护者Jean-Baptiste Quéru在Google+上宣布退出,他退出AOSP项目的原因被认为与 ...

  7. 用c#开发微信 (19) 公众平台接口权限列表说明 - 订阅号、服务号认证后的区别

    最新发现有些原来认证服务号的权限对认证的订阅号开放了,这里是官方的文档说明<公众平台接口权限列表说明>,明显比这里说得详细.准确多了<微信公众平台服务号.订阅号的相关说明>.另 ...

  8. NBIbatis web/winform框架

    Web框架 调用Bussiness和DataAccess可参考微信框架的后台. Pages/Meeting/MeetingList.aspx Pages/Meeting/MeetingEdit.asp ...

  9. 为什么Web 设计会‘死’?

    高质量的Web 模板,成熟的Design Pattern,人工智能的引用,移动技术的冲击是否标志着Web Design 结束的时代已经到来? Web Design 最终也未避免与“死亡”这个词的关联, ...

  10. Backbone Collection——数据模型集合

    如果将一个Model对象比喻成数据库中的一条记录,那么Collection就是一张数据表.它表示为一个模型集合类,用于存储和管理一系列相同类型的模型对象. 1.创建集合集合用于组织和管理多个模型,但它 ...