[Java] jackson注解
Jackson(http://jackson.codehaus.org)库是基于java语言的开源json格式解析工具。相对于javajson解析的其他库,诸如json-lib、gson包,Jackson具有以下优点:
功能全面,提供多种模式的json解析方式,“对象绑定”使用方便,利用注解包能为我们开发提供很多便利。
性能较高,“流模式”的解析效率超过绝大多数类似的json包。
jackson主要的包
jackson-core——核心包(必须),提供基于“流模式”解析的API。核心包:JsonPaser(json流读取),JsonGenerator(json流输出)。
jackson-databind——数据绑定包(可选),提供基于“对象绑定”和“树模型”相关API。数据绑定包:ObjectMapper(构建树模式和对象绑定模式),JsonNode(树节点)。
jackson-annotations——注解包(可选),提供注解功能。
jackson-datatype-joda-2.1.5.jar——日期转换
Jackson注解
1. 重命名属性,忽略属性,以及修改属性所使用的类型。
① 属性重命名时使用的注解
最常见的使用方式之一就是改变某个成员属性所使用的JSON名称。例如: class Name { @JsonProperty("firstName") public String _first_name; }
②忽略属性使用的注解
有时POJO包括了一些你不希望输出的属性,在这种情况下,你可以进行如下操作:
public class Value {
public int value;
@JsonIgnore public int internalValue;
}
或者,你可能忽略掉某些从JSON数据中得到的属性,如果是这样,你可以使用:
@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
public int value;
}
或者,更粗暴点的,忽略掉从JSON(由于在应用中没有完全匹配的POJO)中获得的所有“多余的”属性。
@JsonIgnoreProperties(ignoreUnknown=true)
public class PojoWithAny {
public int value;
}
③choose more/less specific types 时使用的注解
在有些情况下,Jackson在读入或输出一个成员属性时,所选用的类型(type)可能并不是你想要的
@JsonSerialize(as=BasicType.class) 将类型序列化成指定类型
@JsonSerialize(using=CustomDoubleSerialize.class) 作用于属性或者字段上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。
@JsonDeserialize 作用于属性或者字段上,指定反序列化方式
@JsonDeserialize(as=ValueImpl.class) 将类型反序列化成指定类型
@JsonDeserialize(using= CustomDateDeserialize.class) 用于在反序列化时嵌入我们自定义的代码
2. 使用构造器或工厂方法
在默认情况下,当由JSON数据创建相应类的实例时,Jackson尝试使用该类的“默认”构造器(即无参数构造器)。不过,你可以选择使用其他的构造器,或者一个静态工厂方法,来创建实例。完成这个操作,你需要使用@JsonCreator注解,有可能还需要使用@JsonProperty注解给参数(arguments)绑定名称。
publicclass MyBean {
private int value;
@JsonCreator
publicMyBean(@JsonProperty("value") int v) {
this.value = v;
}
public int getValue() { return value; }
}
使用相同的方式,可以将@JsonCreator用在静态工厂方法上。不过,还有一个可选的替代方案,被称作“授权式”构建器(“delegating” creator):
publicclass DelegatingPOJO {
private final int _x, _y; @JsonCreator
publicDelegatingPOJO(Map<String,Object> delegate) {
_x = (Integer)delegate.get("x");
_y = (Integer)delegate.get("y");
}
}
不同之处在于,构建器方法只能有一个参数,而且参数一定不要(must NOT)添加@JsonProperty注解。
3. 处理多态类型
如果你要进行读取、输出操作的对象拥有许多可能的子类型(即表现出多态性),你可能还需要添加一些类型信息。Jackson在反序列化时(读取JSON数据,生成相应的对象)需要这些信息,以便能正确地读取对象的类型。我们可以通过在“基本类型”上添加@JsonTypeInfo注解来完成操作:
@JsonTypeInfo 类注解,当输出操作的对象拥有多个子类型且在反序列化时需要添加子类对象的类型信息,使用此注解可以正确地设置子类对象的类型
@JsonTypeInfo(use=Id.CLASS,include=As.PROPERTY,property=”class”) 子类类型作为属性,属性名为class
// 将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;
}
items序列化之后的结果类似:
{“items” : [
{“class”:”Impl2”, “name”: “Bob”},
{“class”:”Impl1”, :”x” : 13}
]}
4. 重新设置属性的自动发现(Changing property auto-detection)
@JsonAutoDetect
类注解,指定属性发现规则
Jackson默认的属性发现规则将会查找到如下所述的属性:
•所有被public修饰的字段(成员变量);
•所有被public修饰的getter(即形如“getXxx()”的方法);
•所有被public修饰的setter(即形如“setXxx(value)”的方法)
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
更多注解查看http://wiki.fasterxml.com/JacksonAnnotations
原文:http://blog.csdn.net/ljhabc1982/article/details/17553095
[Java] jackson注解的更多相关文章
- Jackson注解学习参考(转)
转:http://wong-john.iteye.com/blog/1753402 以下内容摘录.翻译自https://github.com/FasterXML/jackson-annotations ...
- JAVA配置&注解方式搭建简单的SpringMVC前后台交互系统
前面两篇文章介绍了 基于XML方式搭建SpringMVC前后台交互系统的方法,博文链接如下: http://www.cnblogs.com/hunterCecil/p/8252060.html htt ...
- jackSon注解– @JsonInclude 注解不返回null值字段
@Data @JsonInclude(JsonInclude.Include.NON_NULL) public class OrderDTO { private String orderId; @Js ...
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...
- lombok 简化java代码注解
lombok 简化java代码注解 安装lombok插件 以intellij ide为例 File-->Setting-->Plugins-->搜索"lombok plug ...
- JAVA自定义注解
在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释. ...
- 深入理解Java:注解
注解作用:每当你创建描述符性质的类或者接口时,一旦其中包含重复性的工作,就可以考虑使用注解来简化与自动化该过程. Java提供了四种元注解,专门负责新注解的创建工作. 元注解 元注解的作用就是负责注解 ...
- Java Annotation 注解
java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...
- java自定义注解实现前后台参数校验
2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...
随机推荐
- UVALive 4426 Blast the Enemy! --求多边形重心
题意:求一个不规则简单多边形的重心. 解法:多边形的重心就是所有三角形的重心对面积的加权平均数. 关于求多边形重心的文章: 求多边形重心 用叉积搞一搞就行了. 代码: #include <ios ...
- 理解ThreadLocal(之一)
ThreadLocal是什么 在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编 ...
- 06章 映射一对多双向关联关系、以及cascade、inverse属性
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...
- kettle运行spoon.bat时找不到javaw文件
我也遇到这问题了,分享一下解决方法吧以后没准还有人能用到.我机器的主要问题是环境变量JAVA_HOME的值不对,应该写到jdk也就是C:\Program Files\Java\jdk1.7.0_25, ...
- Openjudge 1.13-28:出现次数超过一半的数
总时间限制: 1000ms 内存限制: 65536kB 描述 给出一个含有n(0 < n <= 1000)个整数的数组,请找出其中出现次数超过一半的数. 数组中的数大于-50且小于50 ...
- 【笔记3】用pandas实现矩阵数据格式的推荐算法 (基于用户的协同)
原书作者使用字典dict实现推荐算法,并且惊叹于18行代码实现了向量的余弦夹角公式. 我用pandas实现相同的公式只要3行. 特别说明:本篇笔记是针对矩阵数据,下篇笔记是针对条目数据. ''' 基于 ...
- js小数点失精算法修正
在用js计算0.07*100时候竟然=7.000000000000001 关于js失精算法你都遇到哪些,让我们一起来细数一下吧 console.log(0.07*100); // 7.00000000 ...
- orcle form 传数据乱码
在jsp顶部加入<%@ page contentType="text/html; charset=utf-8" language="java" impor ...
- C#进阶系列——DDD领域驱动设计初探(四):WCF搭建
前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储.领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再项目搭建的过程中慢慢引入,博主的思路是先将整个架构走通,然后一步一步来添加 ...
- docfx daylybuild
参考:https://myget.org/gallery/docfx-dev 根据对应的vs或nuget版本中添加地址. PS:daylybuild可能包含很多错误哦.