Jackson简介
Jackson作为一个知名,并且经典的Java平台的JSON库,有人说它是最好的JSON解析工具,或者只是一个简单的还行的JSON解析库,不管如何Jackson都是一个值得一学,值得一用的JSON处理库。
Jackson不仅支持流式处理json,还支持数据绑定(POJO和JSON之间的相互转化),甚至还拓展了很多其他第三方库所支持的数据格式(如:Avro, BSON, CBOR, CSV, Smile, (Java) Properties, Protobuf, XML和YAML,Guava, Joda, PCollections)。
Jackson的三个核心模块:
jackson-core : 核心包 定义了低级的流式API,包括了JSON处理细节。
jackson-annotations : 注解包 包含了Jackson的注解。
jackson-databind : 数据绑定包 实现了对象和JSON之间的转换,这个包依赖上面两个包。
Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。
官网:http://wiki.fasterxml.com/JacksonHome
jackson-databind需要引用另外两个包,所以如果项目中需要jackson-databind,则只需要加入它的dependency就行了,其他两个会自动引入:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
如何解析JSON:
尽管有很多种拆分JSON并解析的方法,但是可以归纳成3种:
迭代:对事件流(Jackson称之为Token流)的迭代
数据绑定:将Json数据绑定到对象
遍历树:构建一个树结构并使用合适的方法遍历它
对应的Java的API:
SAX和Stax。这个提供了一些基本的API来遍历事件流。其中,SAX是主动把event推给你(push),Stax是让你可以主动遍历这个事件流(pull)。一个是push,一个是pull,但是事件流都是一样的,只是表现方式不同。提供事件callback的SAX,主动遍历event的Stax,还有一个是Stax Cursor API(游标)。
JAXB是数据绑定的标准; 虽然有n + 1个替代品(Jibx,XMLBeans,Castor等等),但它们都是这样做的:将(Java)对象转换为xml,反之亦然,其中一些方便而有效,另一些则不如此。
DOM是“最标准的”API,它定义了树结构; 但是与数据绑定一样,还有多种(更好的)替代方案(XOM,JDOM,DOM4j)。您可以逐节点遍历它,也可以使用XPath。
虽然上面说的都是XML的,但是我们讨论的是JSON啊!事实证明,格式不重要,重要的是这种解析的思想。
对应了Jackson提供的三个类:
核心包(jackson-core)包含JsonParser和JsonGenerator,它们允许迭代令牌(Jackson喜欢说成令牌token,而不是事件event)。
ObjectMapper实现了数据绑定功能:JSON和Object之间的相互转换。
TreeMapper是把JSON字符串构造成一个树,其中包含了节点(JsonNode)和子节点(JsonNode)。
和Jackson 1.x的区别:
使用Maven作为构建工具,而不是Ant
注释划分到一个单独的包
包改成了com.fasterxml.jackson.core(原来是 org.codehaus.jackson)
Jackson fasterxml和codehaus的区别 (fasterxml vs. codehaus)
Jackson fasterxml和codehaus的区别:
他们是Jackson的两大分支、也是两个版本的不同包名。Jackson从2.0开始改用新的包名fasterxml;1.x版本的包名是codehaus。除了包名不同,他们的Maven artifact id也不同。1.x版本现在只提供bug-fix,而2.x版本还在不断开发和发布中。如果是新项目,建议直接用2x,即fasterxml jackson。
Java下利用Jackson进行JSON解析和序列化,注解应用
JSON注解
Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解。
@JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性。
@JsonFormat 此注解用于属性上,作用是把Date类型直接转化为想要的格式,如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")。
@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name,@JsonProperty("name")。
import java.util.Date;
import com.fasterxml.jackson.annotation.*;
public class User {
private String name;
//不JSON序列化年龄属性
@JsonIgnore
private Integer age;
//格式化日期属性
@JsonFormat(pattern = "yyyy年MM月dd日")
private Date birthday;
//序列化email属性为mail
@JsonProperty("mail")
private String email;
.....
}
另外一篇文章将会介绍具体的应用.
引用链接:http://www.dubby.cn/detail.html?id=9068