jackson 流式API

http://www.cnblogs.com/lee0oo0/articles/2652528.html
Jackson提供了三種可選的JSON處理方法
一、流式API
    com.fasterxml.jackson.core.JsonParser讀
    com.fasterxml.jackson.core.JsonGenerator寫
二、樹模型:提供一個 JSON 文檔可變內存樹的表示形式
    com.fasterxml.jackson.databind.ObjectMapper生成樹 ;樹組成 JsonNode 節點集
    樹模型相似於 XML DOM
三、數據綁定:JSON和POJO相互轉換,基於屬性訪問器規約或註解
    有兩種變體:簡單和完整的數據綁定
        簡單數據綁定:是指從Java Map、List、String、Numbers、Boolean和空值進行轉換
        完整數據綁定:是指從任何Java bean 類型(及上文所述的"簡單"類型)進行轉換
        com.fasterxml.jackson.databind.ObjectMapper對兩個變種進行編排(marshalling)處理(寫入JSON)和反編排(unmarshalling讀JSON)
從使用的角度來看,總結這些3 種方法的用法以下    
    流 API: 性能最佳的方式 (最低開銷、 速度最快的讀/寫; 其它兩者基於它實現)。
    數據綁定 :使用最方便的方式。
    樹模型: 最靈活的方式。


流式API示例
user.json
{
  "name" : { "first" : "Joe", "last" : "Sixpack" },
  "gender" : "MALE",
  "verified" : false,
  "userImage" : "Rm9vYmFyIQ=="
}

pojo
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; }

      public void setFirst(String s) { _first = s; }
      public void setLast(String s) { _last = s; }
    }

    private Gender _gender;
    private Name _name;
    private boolean _isVerified;
    private byte[] _userImage;

    public Name getName() { return _name; }
    public boolean isVerified() { return _isVerified; }
    public Gender getGender() { return _gender; }
    public byte[] getUserImage() { return _userImage; }

    public void setName(Name n) { _name = n; }
    public void setVerified(boolean b) { _isVerified = b; }
    public void setGender(Gender g) { _gender = g; }
    public void setUserImage(byte[] b) { _userImage = b; }
}

junit test
public class JsonStreamTest {
    @Test
    public void read() throws JsonParseException, IOException{
        JsonFactory factory = new JsonFactory();
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("user.json");
        JsonParser jsonParse = factory.createJsonParser(is);
        User user = new User();
        JsonToken token = jsonParse.nextToken();
        if(token==JsonToken.START_OBJECT){
            while((jsonParse.nextToken())!=JsonToken.END_OBJECT){
                String fieldName = jsonParse.getCurrentName();
                jsonParse.nextToken();
                if("name".equalsIgnoreCase(fieldName)){
                    Name name = new Name();
                    while(jsonParse.nextToken()!=JsonToken.END_OBJECT){
                        if(jsonParse.getCurrentName().equals("first")){
                            name.setFirst(jsonParse.getText());
                        }
                        if(jsonParse.getCurrentName().equals("last")){
                            name.setLast(jsonParse.getText());
                        }
                    }
                    user.setName(name);
                }else if("gender".equals(fieldName)){
                    String text = jsonParse.getText();
                    user.setGender(Gender.valueOf(text));
                }else if("verified".equals(fieldName)){
                    user.setVerified(jsonParse.getBooleanValue());
                }else if("userImage".equals(fieldName)){
                    user.setUserImage(jsonParse.getBinaryValue());
                }
            }
        }
        jsonParse.close();
    }
    
    @Test
    public void write() throws IOException{
        JsonFactory jsonFactory = new JsonFactory();
        JsonGenerator jg = jsonFactory.createGenerator(new File("user2.json"), JsonEncoding.UTF8);
        jg.useDefaultPrettyPrinter();
        jg.writeStartObject();
        jg.writeObjectFieldStart("name");
        jg.writeStringField("first", "Joe");
        jg.writeStringField("last", "Sixpack");
        jg.writeEndObject();
        jg.writeStringField("gender", Gender.MALE.name());
        jg.writeBooleanField("verified", false);
        jg.writeFieldName("userImage");
        byte[] binaryData = new byte[]{70, 111, 111, 98, 97, 114, 33};
        jg.writeBinary(binaryData);
        jg.writeEndObject();
        jg.close();
    }
}html

相關文章
相關標籤/搜索