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