开源框架jackson简介

10月 5, 2014

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格式

应用举例:

  1. 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的方式来进行运用

实际项目中采用如上形式较多

  1. 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 nameStruct = new HashMap();
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);
  1. 泛型 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<?,?>也可以达到如上效果