Java JSON(一)Jackson区别于竞争对手的7个杀手锏--转

标签: java json jackson | 发表时间:2014-06-17 19:02 | 作者:zouruixin
出处:http://www.iteye.com
转自:http://www.blogjava.net/wangxinsh55/archive/2012/09/06/387179.html


http://simpleframework.net/blog/v/20053.html


Jackson JSON 处理器 为一行之有效的Java JSON处理器,诸如它具有如下特点:

    简但且方便的JSON解析,以及与Java对象的相互转换。
    通过注释(annotations)和配置(settings)可扩展的配置性。
    超快的基于流的解析性能,以及完整的数据绑定。

但许多其他Java的JSON库仅考虑方便性和配置性,性能反倒不是面向用户的最重要层面。

那么,为何Java开发人员不选择Jackson而放弃其竞争产品呢?

以上功能的简短列表其实不过是Jackson功能的冰山一角。 的确,这三个常见功能是重要的,但某种程度上也仅是最基本的东西,起码,JSON处理器应被作为值得考虑的工具使用。除此之外,还有很多很多功能应该提供,而这也正是Jackson具备的能力。

因此,让我们来看看7个样例 -- 吉祥的数字 -- "杀手锏" --Jackson近年来领先竞争对手的几点,依据先后顺序介绍(始于1.0版,最新的一个特性是1.6版加入的)。

1.多处理模式,且可很好协作

从基本开始,有多种方法来使用和生产JSON数据,尽管多数JSON包仅提供单一的处理方式,但却有三种互补的JSON处理方式(详细解释见:There are Tree ways...):

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

尽管多角度的好处显而易见,且各自提供最佳的用例,很少有(如果有的话?)其他的Java JSON包提供这些规范的处理模式。
大多数只提供一个模式(org.json以树组织数据; Gson实现了数据绑定)。 Jackson提供所有模式,所有模式完全支持,且最棒的是,它很容易在两种模式之间转换,混合和适配。 例如,处理非常大的JSON流时,通常始于流解析,而使用数据绑定器将子数据段绑定到Java对象:这允许处理巨大的文件而没有过多的内存占用,但却提供 完整便利的数据绑定能力。

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

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

Jackson thinks that developers deserve ability to specify whatever constructor or factory methods they want for instantiation; just annotate thing you want like so:Jacson认为,开发者应该能够指定他们想为实例化的任何工厂或构造方法,只要你喜欢,注释即可:

    public class MyBean {
      private final int value;
      @JsonCreator
      public MyBean(@JsonProperty("value") int v) {
        this.value = v;
      }
      public int getValue() { return value; }
    }

而你可以这样定义POJO,JSON处理的情况下也无妨。(Jackson处理不可变对象的信息,可见: 博客条目 )

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反序列化,大多数需要用户建立应用代码显式进行类型解析。


杰克逊怎么样? Jackson 不仅支持自动序列化和反序列化动态和多态类型,它试图尽力把它做好。具体来说,没有必要公开Java类名(这是其它JSON包支持多态的唯一机制)作为类 型信息 - 尽管,人们可以,它是可配置 - 但可以使用逻辑类型名称(通过注解,或注册实现配置)。不管采用什么类型的标识符,包含的方法也可以配置(这很好,因为极大地简化了JSON格式)。所有 这一切都与合理的缺省功能,具有上下文适用性(这意味着你也可以定义不同类型的设置!)。

关于Jackson如何处理多态,详见: "Jackson 1.5: 多态类型处理"。

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);

(不收你200元...呃,书写10行代码的猴子 - 注意,那就是,我们可以省略接口中的'setX();Bean先生很聪明,知道一些方法需要注入值)。

只有一行配置,便可实现这神奇的功能(又称“Bean先生”)。更多关于物化接口的信息参见“ 物化接口信息“。

.我还没有找到一个愿写这些接口实现的编码人员,因此,如果寻找Jackson的单一功能亮点,那就是它了。

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

经过前面的通用功能集,我们总结的东西更为具体:能够干净地处理循环类型的某些子集,成为父/子链接。 这些都是互相紧密耦合的引用,其中两个对象以层次结构的方式交叉引用,如父/子树节点的关联, 或更常见的,ORM采用的表间连接(join)的描述。

对引用问题(或更普遍的,循环引用),JSON没有处理它们的自然方法。,不像Java对象,没有标识信息可用。
常用的解决方法是只标记一个被忽略的引用(Jackson可通过使用@ JsonIgnore注解实现),但其缺点是反序列化时会丢失实际的耦合目标。

Jackson 有简单的基于注解的解决该问题的方案:两个引用需要一个注解(对“子”连接作@JsonManagedReference注解,对“父”或“返回”连接作 @JsonBackReference注解),并在此基础,Jackson知道要省略反向引用的序列化,但反序列化对象时要恢复它。此方式适用于典型的 ORM用例。

8. 这是全部吗,有何异议?

实际上,Jackson的一些特性并未包含在本文中,若如此,请指正!


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java json jackson] 推荐:

Java下利用Jackson进行JSON解析和序列化

- - 企业架构 - ITeye博客
Java下常见的Json类库有Gson、JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的JSON操作方法. 首先去官网下载Jackson工具包,下载地址http://wiki.fasterxml.com/JacksonDownload.

Java JSON(一)Jackson区别于竞争对手的7个杀手锏--转

- - 开源软件 - ITeye博客
转自:http://www.blogjava.net/wangxinsh55/archive/2012/09/06/387179.html. Jackson JSON 处理器 为一行之有效的Java JSON处理器,诸如它具有如下特点:.     简但且方便的JSON解析,以及与Java对象的相互转换.

Json解析工具Jackson(使用注解)

- - 行业应用 - ITeye博客
       接上一篇文章 Json解析工具Jackson(简单应用),jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解.          此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响.

JSON库之性能比较:JSON.simple VS GSON VS Jackson VS JSONP

- - Java译站
Java中哪个JSON库的解析速度是最快的. JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了. 我们很少会去想用到的这些JSON库到底有什么不同,但事实上它们的确是不太一样的. 因此,我们运行了一个基准测试来对常用的几个JSON库进行了测试,看看在解析不同大小的文件时哪个库的速度是最快的.

json学习(java篇)

- - 博客园_首页
前一个小项目中用到了json:服务器返回的数据有xml或者json格式的数据,由于json简洁、轻量、高性能等优点,我们当时就采用的是json格式的数据. 上个月没有心情学习啊,就索性多玩会儿,不过今年得有个目标,至少博客得多写写,质量上也希望比前几个月有所提升,那就开始吧. 先从json基础知识开始学起.

[Json]json-lib简单处理java对象变为json对象

- - CSDN博客编程语言推荐文章
由于js对json的原生支持,所以现在很多项目的数据传输都喜欢用json. 怎么样把数据从java对象转化为json对象,有怎么把前台的json对象转化成java对象去处理. json-lib是sourceforge的一个开源项目,常用来解决java json数据转换的问题. 下载地址是 http://sourceforge.net/projects/json-lib/.

GitHub - json-path/JsonPath: Java JsonPath implementation json 类xpath 解析工具

- -
JsonPath expressions always refer to a JSON structure in the same way as XPath expression are used in combination with an XML document. Functions can be invoked at the tail end of a path - the input to a function is the output of the path expression.

JSON与JAVA的数据转换

- - BlogJava_首页
本文介绍如何使用JSON-lib这个Java类包实现Java的数据转换. 通过此类包可以把bean,map和XML转换成JSON并能够把JSON转回成bean和DynaBean. JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把JSON转回成bean和DynaBean.

判断字符串是否是有效json对象(java + gson )

- - 改善
已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

使用Gson实现Json和Java对象的转换

- - ITeye博客
Gson是Google的开源项目(项目主页: https://code.google.com/p/google-gson/),. Gson在线帮助文档: http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html.