在Java平台(StAX, JAXB等)XML处理质量和多样化的激励下,Jackson为多功能的Java JSON处理包其目标为集快捷、正确、轻量和符合人体工程学与一体。
本文将给出Jackson的功能概览。
JSON的三种处理方式
Jackson提供了三种可选的JSON处理方法(一种方式及其两个变型):
-
流式
API:(也称为"增量分析/生成") 读取和写入 JSON 内容作为离散事件。-
org.codehaus.jackson.JsonParser 读, org.codehaus.jackson.JsonGenerator 写。
-
StAX API
的激励。
-
-
树模型 :提供一个
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 种方法的用法如下:
鉴于这些特性,让我们考虑以相反的顺序,以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);
用户类大致如下(源自另一博客):
1 public class User {
2 public enum Gender { MALE, FEMALE };
3
4 public static class Name {
5 private String _first, _last;
6
7 public String getFirst() { return _first; }
8 public String getLast() { return _last; }
9
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提供注解来自定义编排和反编排的处理过程。
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");