Jackson:Java开源JSON格式解析工具

Java下常见的Json类库有Gson、JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换, Jackson库,是基于Java语言的开源JSON格式解析工具,整个库(使用最新的2.2版本)包含3个jar包:

  • jackson-core.jar——核心包(必须),提供基于“流模式”解析的API。
  • jackson-databind——数据绑定包(可选),提供基于“对象绑定”和“树模型”相关API。jackson-annotations——注解包(可选),提供注解功能。

jackson
Jackson的优点
相对于Java JSON解析的其他库,诸如json-lib、gson包,Jackson具有以下优点:

1.多处理模式,且可很好协作 。从基本用法开始,有多种方法来使用和生产JSON数据,尽管多数JSON包仅提供单一的处理方式,但却有三种互补的JSON处理方式:

  • 增量解析及生成(流模式)。高性能,低开销的顺序访问。这是最低级的处理方法,相当于用于处理XML的SAX和StAX API。所有包装内部必须有这样的分析器,但并非所有都公开。
  • 基于树的数据模式(JSON DOM)。 树是一种描述JSON内容的自然的概念模型,因此许多软件包提供将JSON作为逻辑树处理的功能。这是一个灵活的模式,可很好适用某类任务,原型处理或即席访问也相当杰出。
  • 数据绑定(JSON 与POJO相互转换。极为方便,通常较树状模式更高的存取效率,也是适于Java开发人员通用的自然的数据绑定方式。常用于大多数Java REST框架,诸如JAX-RS。

2. 可使用任何构造及工厂方法(不只是默的零参方法)

  • 大多数数据(对JSON和XML)绑定工具需要一个定义和无参数的构造函数,实例化Java对象,并通过setter设置属性或直接访问字段。 不幸的是它使人们难以利用用“不可变对象”模式,也不同于正常代码中的访问模式。

3.不仅是注解,可以混合式注解!

  • 虽然有很多好处,利用Java注解定义元数据(如类型安全、编译时检查,消除单独的XML配置,DTY原则等),但也有缺点:如明显的是,添加注解须能修改类。 而你通常不能(也不应该)修改第三方库的代码,至少不只是JSON序列化配置方面。 但是,如果你只可以松散动态关联注释,而不是嵌入在代码中?我认为这是个了不起的想法,不管你对Jackson的混合式注解了解多少:您可以将注释与目标类关联(声明为代理接口或类的一部分)目标类的处理方式如同目标类本身声明的注解一样。

4. 完全支持泛型类型

  • 现在泛型是Java开发的完整组成部分,然而,并非所有的JSON库支持泛型,甚至在处理非常复杂的数据类型时会出错。
  • 以下列泛型为例:
  • public class Wrapper<T> { public T value; } public class ListWrapper<E> extends Wrapper<List<E>> { }
  • 若需反序列化这些类型的数据,代码如下:
  • ListWrapper<Integer> w = objectMapper.readValue(“[{“value”:13},{“value”:7}]”, new TypeReference<ListWrapper<Integer>>() { } );
  • Jackson在弄清必要的东西及生成期望的值方面有点小麻烦,但却是支持泛型(或更多)的仅有的Java包。

5.多态类型

  • 下面是另一个factoid:继承和多态类型可用于面向对象开发的很好方法,但也是任意实现数据绑定功能的系统的PITA。
  • ORM(如Hibernate)大部分的复杂性是由于沿继承层次结构扁平化和非扁平化数据功能的需要,同样适用于像JAXB的数据序列化包。这也就难怪,当时,只有极少数的Java包支持多态类型的JSON反序列化,大多数需要用户建立应用代码显式进行类型解析。

6.物化接口 (even less monkey code to write!)

  • 尽管支持多态类型是强大的功能 — 但却存在固有的充足的复杂性 — 这里是简化事情的方式:物化接口(或抽象类)。
  • 给定接口如下:
  • public interface Bean { public int getX(); public void setX(int value); }
  • 你可能想跳过这一步“Bean接口实现,包含两倍代码的类”,而直接处理:
  • Bean bean = objectMapper.readValue(json, Bean.class);
  • 只有一行配置,便可实现这神奇的功能(又称“Bean先生”)。

7.支持父/子引用(一对多,ORM)

  • 经过前面的通用功能集,我们总结的东西更为具体:能够干净地处理循环类型的某些子集,成为父/子链接。 这些都是互相紧密耦合的引用,其中两个对象以层次结构的方式交叉引用,如父/子树节点的关联, 或更常见的,ORM采用的表间连接(join)的描述。
  • 对引用问题(或更普遍的,循环引用),JSON没有处理它们的自然方法。,不像Java对象,没有标识信息可用。 常用的解决方法是只标记一个被忽略的引用(Jackson可通过使用@ JsonIgnore注解实现),但其缺点是反序列化时会丢失实际的耦合目标。 Jackson 有简单的基于注解的解决该问题的方案:两个引用需要一个注解(对“子”连接作@JsonManagedReference注解,对“父”或“返回”连接作 @JsonBackReference注解),并在此基础,Jackson知道要省略反向引用的序列化,但反序列化对象时要恢复它。此方式适用于典型的 ORM用例。

重要API

  • 核心包:JsonPaser(json流读取),JsonGenerator(json流输出)。
  • 数据绑定包:ObjectMapper(构建树模式和对象绑定模式),JsonNode(树节点)。

简单例子

在实际应用中,用的最多的是数据对象绑定的模式,即将一个对象序列化为json字符串和将一串json字符串反序列化为Java对象或Map。

开发资源

官方网站:http://wiki.fasterxml.com/JacksonHome
开源地址:https://github.com/FasterXML/jackson

1 2 收藏

资源整理者简介:cheenlie

热爱技术的程序猿!凡在小事上对真理持轻率态度的人,在大事上也是不足信的! 个人主页 · 贡献了1个资源


直接登录

推荐关注

按分类快速查找

关于资源导航
  • 伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。目前已经收录 1440 项工具资源。
    推送伯乐头条热点内容微信号:jobbole 分享干货的技术类微信号:iProgrammer