开源框架jackson简介
Jackson提供了3种可选的方法来进行JSON解析
- Streaming API可以离散地读写JSON内容
- org.codehaus.jackson.JsonParser可以读取
- org.codehaus.jackson.JsonGenerator可以写出
- Tree Model提供了一个可变的内存树来展示JSON文件
- org.codehaus.jackson.map.ObjectMapper可以建树,其中包含了JsonNode内容
- Tree的内容和XML DOM形式相同
- Data Binding 能降JSON转换成POJO,转换的形式是以annotations为基础的
- 有两种形式:simple和full data binding
- Simple data binding:转换为Java Maps,Lists,Strings,Numbers,Booleans,Nulls
- Full data binding:转换成任意的Java bean格式
- 有两种形式:simple和full data binding
应用举例:
Full Data Binding(POJO) 举例
org.codehaus.jackson.map.ObjectMapper 可以讲JSON data转化成java beans格式的内容`
{ "name" : { "first" : "Joe", "last" : "Sixpack" }, "gender" : "MALE", "verified" : false, "userImage" : "Rm9vYmFyIQ=="
}
`
它将java中的两行代码转换为一个User的实例
1 ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
2 User user = mapper.readValue(new File(“user.json”), User.class);
其中User类是如下所示:
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);
对于更加灵活地data binding,Jackson提供了annotation的方式来进行运用
实际项目中采用如上形式较多
- Raw 形式的data binding 栗子
对一些没有特别声明的java 类与JSON 转换/被转化,”Untyped data binding”是一个较好地方式。
早期的JSON binding如下所示:
Map<String,Object> userData = mapper.readValue(new File("user.json"), Map.class);
并且userData 将被如下方式构造:
1 Map<String,Object> userData = new HashMap<String,Object>();
2 Map
3 nameStruct.put(“first”, “Joe”);
4 nameStruct.put(“last”, “Sixpack”);
5 userData.put(“name”, nameStruct);
6 userData.put(“gender”, “MALE”);
7 userData.put(“verified”, Boolean.FALSE);
8 userData.put(“userImage”, “Rm9vYmFyIQ==”);
构造Map,可以使用如下代码:
mapper.writeValue(new File("user-modified.json"), userData);
- 泛型 Data Binding
对于那些使用泛型的情况,需要使用Type Erasure 来防止使用使用Collection<String>.class
,因此如果需bind data到一个Map<String,User>
,需要使用如下代码:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
其中TypeReference是只能被传递给一个泛型定义的,其中重要的部分 定义了需要binding 的类型
若不想使用如上形式,只要定义
Map<?,?>
也可以达到如上效果