现在的位置: 首页 > 综合 > 正文

Java JSON(二)5分钟学会Jackson

2013年10月25日 ⁄ 综合 ⁄ 共 2570字 ⁄ 字号 评论关闭
Java JSON(二)5分钟学会Jackson
3评/4344阅
发表于: 2011-04-04 13:40

在Java平台(StAX, JAXB等)XML处理质量和多样化的激励下,Jackson为多功能的Java JSON处理包其目标为集快捷、正确、轻量和符合人体工程学与一体。

本文将给出Jackson的功能概览。

JSON的三种处理方式 
Jackson提供了三种可选的JSON处理方法(一种方式及其两个变型):

  • 流式
    API
    (也称为"增量分析/生成") 读取和写入 JSON 内容作为离散事件。

  • 树模型 :提供一个
    JSON 文档可变内存树的表示形式。

    • org.codehaus.jackson.map.ObjectMapper 生成树
      树组成 JsonNode 节点集。

    • 树模型类似于 XML DOM。
  • 数据绑定: JSON和POJO相互转换,基于属性访问器规约或注解。

    • 有 两种变体: 简单 和 完整 的数据绑定:

    • 简单数据绑定: 是指从Java Map、List、String、Numbers、Boolean和空值进行转换

    • 完整数据绑定 :是指从任何 Java bean 类型 (及上文所述的"简单"类型)
      进行转换

    • org.codehaus.jackson.map.ObjectMapper 对两个变种,进行编组(marshalling )处理
      (写入 JSON) 和反编组(unmarshalling ,读 JSON)。

    • JAXB激励下的基于注释的
      (代码优先)变种。

从使用的角度来看,总结这些3 种方法的用法如下:


  • API
    : 性能最佳的方式 (最低开销、 速度最快的读/写; 其它二者基于它实现)。

  • 数据绑定 :使用最方便的方式。

  • 树模型
    最灵活的方式。

鉴于这些特性,让我们考虑以相反的顺序,以Java开发人员最自然和方便的方法开始使用: 杰Jackson数据绑定
API

Jackson的 org.codehaus.jackson.map.ObjectMapper "只是"将JSON 数据映射为POJO 对象 。例如,给定 JSON 数据:

{
  "name" : { "first" : "Joe", "last" : "Sixpack" },
  "gender" : "MALE",
  "verified" : false,
  "userImage" : "Rm9vYmFyIQ=="
}

用两行代码把它变成一个用户实例:

1 ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
2 User user = mapper.readValue(new File("user.json"), User.class);

用户类大致如下(源自另一博客):

public class User {
public enum Gender { MALE, FEMALE };

public static class Name {
private String _first, _last;

public String getFirst() { return _first; }
public String getLast() { return _last; }

10 public void setFirst(String s) { _first = s; }
11 public void setLast(String s) { _last = s; }
12 }
13 
14 private Gender _gender;
15 private Name _name;
16 private boolean _isVerified;
17 private byte[] _userImage;
18 
19 public Name getName() { return _name; }
20 public boolean isVerified() { return _isVerified; }
21 public Gender getGender() { return _gender; }
22 public byte[] getUserImage() { return _userImage; }
23 
24 public void setName(Name n) { _name = n; }
25 public void setVerified(boolean b) { _isVerified = b; }
26 public void setGender(Gender g) { _gender = g; }
27 public void setUserImage(byte[] b) { _userImage = b; }
28 }

编组为JSON同样简单:

mapper.writeValue(new File("user-modified.json"), user);

 对于更复杂的数据绑定 (例如,反编排格式日期到 java.util.Date),Jackson提供注解来自定义编排和反编排的处理过程。

简单的数据绑定示例
如果你没有 (或不想创建)从 JSON到 Java 的相互转化类,简单数据绑定可能是更好的方法。它用相同方式实现完整的数据绑定,除非形式化绑定类型只指定为 Object.class (或 Map.class, List.class,即使需要更多的类型定义)。因此早期绑定JSON的用户数据可能如此实现:

Map<String,Object> userData = mapper.readValue(new File("user.json"), Map.class);

 userData 像一个的显式结构:

   1 Map<String,Object> userData = new HashMap<String,Object>();
2 Map<String,String> nameStruct = new HashMap<String,String>();
3 nameStruct.put("first", "Joe");

抱歉!评论已关闭.