Jackson注解学习参考(转)
转: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注解学习参考(转)的更多相关文章
- jackson 注脚学习参考
(1)初级我们从几个简单的使用场景开始:重命名属性,忽略属性,以及修改属性所使用的类型.注意:下面的例子仅仅显示了成员属性(field properties),注解同样也可以用在成员方法(getter ...
- 转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariab ...
- Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable (转)
最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...
- Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable(转)
最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...
- JackSon fasterxml学习
概述 Jackson框架是基于Java平台的一套数据处理工具,被称为"最好的JavaJson解析器". Jackson框架包含了3个核心库:streaming,databind, ...
- [Java] jackson注解
Jackson(http://jackson.codehaus.org)库是基于java语言的开源json格式解析工具.相对于javajson解析的其他库,诸如json-lib.gson包,Jacks ...
- Mongoose学习参考文档——基础篇
Mongoose学习参考文档 前言:本学习参考文档仅供参考,如有问题,师请雅正 一.快速通道 1.1 名词解释 Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model ...
- 【转】Spring 注解学习手札(超好的springmvc注解教程)
Spring 注解学习手札(一) 构建简单Web应用 Spring 注解学习手札(二) 控制层梳理 Spring 注解学习手札(三) 表单页面处理 Spring 注解学习手札(四) 持久层浅析 Spr ...
- jackSon注解– @JsonInclude 注解不返回null值字段
@Data @JsonInclude(JsonInclude.Include.NON_NULL) public class OrderDTO { private String orderId; @Js ...
随机推荐
- 微信LazyMan笔试题的深入解析和实现
一.题目介绍 以下是我copy自网上的面试题原文: 实现一个LazyMan,可以按照以下方式调用: LazyMan("Hank")输出: Hi! This is Hank! ...
- twemproxyRedis协议解析探索——剖析twemproxy代码正编
这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...
- Hadoop权威指南:HDFS-数据流
Hadoop权威指南:HDFS-数据流 [TOC] 剖析文件读取 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说, 这个对象是分布式文件系统的一个实例 ...
- We Chall-Training: Crypto - Caesar I-Writeup
MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...
- 读书笔记 effective c++ Item 8 不要让异常(exceptions)离开析构函数
1.为什么c++不喜欢析构函数抛出异常 C++并没有禁止析构函数出现异常,但是它肯定不鼓励这么做.这是有原因的,考虑下面的代码: class Widget { public: ... ~Widget( ...
- Android jni 编程3(对基本类型一维整型数组的操作)总结版
主要学习资料:黑马程序员的NDK方法使用(生产类库so) jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...
- AMD的cpu如何安装Mac OS
AMD的cpu如何安装Mac OS 经过一个月的折腾,终于成功的安装了自己的Mac系统,并且能够成功的启动.在这里分享一下自己安装的经验. 为了安装方便,有不影响原来的系统的使用 ...
- RadAsm使用
RadASM 命令行语法 DelCheck,Out,Command,F1[,F2[,Fx]] DelCheck 执行命令前要清除的文件,不使用时设为0 Out 一般指定为O,所有信 ...
- 4105: [Thu Summer Camp 2015]平方运算
首先嘛这道题目只要知道一个东西就很容易了:所有循环的最小公约数<=60,成一条链的长度最大为11,那么我们就可以用一个很裸的方法.对于在链上的数,我们修改直接暴力找出并修改.对于在环上的数,我们 ...
- RDLC系列(一)ASP.NET RDLC 报表自定义数据源
最近一段时间开发ERP系统中要用到不少报表打印,在网上找了一圈发现想些好用的报表控件大部分要收费,一些面免费要么不好用要么IE8不兼容,最后还是用了微软自带的RDLC报表,把自己遇到的坑和技巧整理分享 ...