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注解的更多相关文章

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

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

  2. JAVA配置&注解方式搭建简单的SpringMVC前后台交互系统

    前面两篇文章介绍了 基于XML方式搭建SpringMVC前后台交互系统的方法,博文链接如下: http://www.cnblogs.com/hunterCecil/p/8252060.html htt ...

  3. jackSon注解– @JsonInclude 注解不返回null值字段

    @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class OrderDTO { private String orderId; @Js ...

  4. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  5. lombok 简化java代码注解

    lombok 简化java代码注解 安装lombok插件 以intellij ide为例 File-->Setting-->Plugins-->搜索"lombok plug ...

  6. JAVA自定义注解

    在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释. ...

  7. 深入理解Java:注解

    注解作用:每当你创建描述符性质的类或者接口时,一旦其中包含重复性的工作,就可以考虑使用注解来简化与自动化该过程. Java提供了四种元注解,专门负责新注解的创建工作. 元注解 元注解的作用就是负责注解 ...

  8. Java Annotation 注解

    java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...

  9. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

随机推荐

  1. C#基础-事件 继承类无法直接引发基类的事件

    An event can be raised only from the declaration space in which it is declared. Therefore, a class c ...

  2. PHP开发工具+电子书+视频教程等资料下载汇总

    本汇总帖包括如下内容: PHP开发工具.PHP IDE PHP学习资源 基础.进阶类 PHP学习资源 高级及应用类 经典PHP视频教程系列 1. PHP开发工具.PHP IDE: PHP开发工具:Ze ...

  3. 图片左右间隔滚动Jquery特效

    图片左右间隔滚动Jquery特效,支持自动播放的开启与关闭,同时支持左右箭头的点击播放,具体处理程序如下 <!DOCTYPE html > <html> <head> ...

  4. [译]Spring构建微服务

    此文为译文,原文地址 介绍 本文通过一个使用Spring.Spring Boot和Spring Cloud的小例子来说明如何构建微服务系统. 我们可以通过数个微服务组合成一个大型系统. 我们可以想象下 ...

  5. 备忘:用fiddler搭一个请求响应器

    最近工作中发现美国的服务器响应慢,影响工作效率.就在想办法.突然发现fiddler可以帮我解决这个问题.AutoResponder功能可以帮我们做到.在其中设置一些请求,比如:http://xxxx. ...

  6. go 聊天室简单版总结

    /* * 思路:在登录成功时将用户的id存进在线用户列表中的key value中链接的ws为空,并保存用户的信息. * 当跳转到聊天室时,将用户和聊天室链接的ws存进在线用户列表中的 * 问题:如何在 ...

  7. Could not execute action

    2.Could not execute action 原因:action成员变量有空值,要访问方法中,使用了该成员变量 参考: http://www.blogjava.net/javagrass/ar ...

  8. linux免交互登陆远程主机并执行命令(密钥对和Expect)

    原文章摘自:http://lizhenliang.blog.51cto.com/7876557/1607723/ Linux下实现免交互登陆一般有两种: 1. SSH无密码认证方式 客户端使用ssh- ...

  9. 用CSS绘制最常见的形状和图形

    #rectangle { width: 200px; height: 100px; background: red; } #circle { width: 100px; height: 100px; ...

  10. Dirac Delta Function

    也称为Degenerate pdf, 退化概率密度函数. 未经考证的解释是: 当正态分布的\(\sigma \to 0\)时, 正态分布就退化为这个分布了. 定义 \[ \delta(x) = \be ...