`
zzc1684
  • 浏览: 1192404 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Jackson注解学习参考

阅读更多

以下内容摘录、翻译自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。[/size][/size]

  • Jackson注解学习参考.zip (8.4 KB)
  • 下载次数: 0
 

编译:Jackson注解学习参考

地址:http://www.07net01.com/linux/Jacksonzhujiexuexicankao_44238_1356358422.html

分享到:
评论

相关推荐

    jackson注解包2.2.3.rar

    jackson的注解包 2.2.3版本 jackson-annotaion-2.2.3.jar

    JACKSON 经典电动力学习题解答

    JACKSON 经典电动力学习题解答,不多说了,经典中的经典阿,对学习经典电动力学很有帮助

    jackson电动力学习题答案

    jackson电动力学习题答案 jackson的电动力学应该是最经典的著作了,这个pdf是这本书习题的答案. 希望大家喜欢.

    Jackson 入门Jackson 入门

    Jackson 入门 Jackson 入门 Jackson 入门

    jackson-annotations, 对于Jackson数据处理器,核心注解( 仅依赖于.zip

    jackson-annotations, 对于Jackson数据处理器,核心注解( 仅依赖于 概述这个项目包含了Jackson数据处理器的通用注释,用于值和处理程序类型。 惟一不包括的注释是需要依赖于 Databind包的注释。项目包含版本 2.0和上...

    jackson-databind jackson-annatation jackson-core jackson-mapper

    jackson-databind jackson-annatation jackson-core jackson-mapper

    jackson 完整Jar包

    jackson-annotations:注解包 jackson-databind:数据绑定包 jackson-databind需要引用另外两个包,所以如果项目中需要jackson-databind,则只需要加入它的dependency就行了,其他两个会自动引入: &lt;dependency&...

    jackson-annotations.jar jackson-core.jar jackson-databind.jar

    jackson-annotations.jar jackson-core.jar jackson-databind.jar

    jackson-annotations-2.13.1-API文档-中文版.zip

    赠送jar包:jackson-annotations-2.13.1.jar; 赠送原API文档:jackson-annotations-2.13.1-javadoc.jar; 赠送源代码:jackson-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    jackson-databind-2.12.5-API文档-中文版.zip

    赠送jar包:jackson-databind-2.12.5.jar; 赠送原API文档:jackson-databind-2.12.5-javadoc.jar; 赠送源代码:jackson-databind-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    jackson-databind-2.13.1-API文档-中文版.zip

    赠送jar包:jackson-databind-2.13.1.jar; 赠送原API文档:jackson-databind-2.13.1-javadoc.jar; 赠送源代码:jackson-databind-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    jackson-2.7.0版架包

    jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-...

    jackson-annotations-2.11.4-API文档-中文版.zip

    赠送jar包:jackson-annotations-2.11.4.jar; 赠送原API文档:jackson-annotations-2.11.4-javadoc.jar; 赠送源代码:jackson-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    jackson-annotations、jackson-core、jackson-databind

    jackson2.9 搭配spring4使用,如果版本不符合,会出现“http请求415错误Unsupported Media Type”错误

    jackson-databind-2.9.7-API文档-中文版.zip

    赠送jar包:jackson-databind-2.9.7.jar; 赠送原API文档:jackson-databind-2.9.7-javadoc.jar; 赠送源代码:jackson-databind-2.9.7...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    jackson-databind-2.9.10.8.jar升级相关jar包

    jackson-databind-2.9.10.8.jar升级相关jar包包含: jackson-module-jaxb-annotations-2.9.10.jar jackson-core-2.9.10.jar jackson-databind-2.9.10.8.jar jackson-annotations-2.9.10.jar jackson-jaxrs-json-...

    jackson-databind, Jackson通用数据绑定包( 2.x ).zip

    jackson-databind, Jackson通用数据绑定包( 2.x ) 概述这个项目包含 Jackson... 它构建在核心流解析器/生成器包之上,并使用 Jackson注解( ) 。 项目许可证在 Apache许可 2.0.当Jackson的原始用例是JSON数据绑定时,现

    jackson-2.9.9 jar包【三个包】

    jackson-annotations,注解包,提供标准注解功能;jackson-databind ,数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和...

Global site tag (gtag.js) - Google Analytics