开源框架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<?,?>也可以达到如上效果