`
seawavecau
  • 浏览: 749219 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Jackson 入门 【转】

 
阅读更多

同事的一些测试结果看来,Jackson在处理Json方面性能相对占优,于是关注了下它,下方大部分从官方文档翻译过来。

 

原文链接:

http://jackson.codehaus.org/Tutorial

 

Jackson有三种处理方式:

Streaming API

  •     使用org.codehaus.jackson.JsonParser 进行读操作 , 使用org.codehaus.jackson.JsonGenerator 写操作
  •     Jackson Streaming API有点类似 Stax API

数据绑定   它允许我们把Json转换成Java对象,也可以把Java对象转换成Json对象

  •    org.codehaus.jackson.map.ObjectMapper 知道如何把Json数据绑定成为(或者映射回)Java对象

树模型   通过进驻内存的树形结构来方便的访问Json数据

  •   和数据绑定方式类似,树模型也使用了 org.codehaus.jackson.map.ObjectMapper进行Json数据和Java对象的绑定;只是树形结构由 org.codehaus.jackson.map.JsonNode节点组成

 

 

从使用的角度看,上述三种方式可以归纳为

  • Streaming API是性能最优的(开销最小,最快的读写速度)  注:在我看来,操作最随心所欲的
  • 数据绑定是最方便使用的
  • 树形模型又是最灵活的

 

 

Java类:

Java代码 复制代码 收藏代码
  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. }  
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; }
}
 

  JSon数据:

Java代码 复制代码 收藏代码
  1. {   
  2.   "name" : { "first" : "Joe""last" : "Sixpack" },   
  3.   "gender" : "MALE",   
  4.   "verified" : false,   
  5.   "userImage" : "Rm9vYmFyIQ=="  
  6. }  
{
  "name" : { "first" : "Joe", "last" : "Sixpack" },
  "gender" : "MALE",
  "verified" : false,
  "userImage" : "Rm9vYmFyIQ=="
}
 

Streaming API (这部分我比较关注,就先翻译下)比数据绑定的方式会快20%到30%

写操作:

Java代码 复制代码 收藏代码
  1. JsonFactory f = new JsonFactory();   
  2. JsonGenerator g = f.createJsonGenerator(new File("user.json"));   
  3.   
  4. g.writeStartObject();   
  5. g.writeObjectFieldStart("name");   
  6. g.writeStringField("first""Joe");   
  7. g.writeStringField("last""Sixpack");   
  8. g.writeEndObject(); // for field 'name'   
  9. g.writeStringField("gender", Gender.MALE);   
  10. g.writeBooleanField("verified"false);   
  11. g.writeFieldName("userImage"); // no 'writeBinaryField' (yet?)   
  12. byte[] binaryData = ...;   
  13. g.writeBinary(binaryData);   
  14. g.writeEndObject();  
JsonFactory f = new JsonFactory();
JsonGenerator g = f.createJsonGenerator(new File("user.json"));

g.writeStartObject();
g.writeObjectFieldStart("name");
g.writeStringField("first", "Joe");
g.writeStringField("last", "Sixpack");
g.writeEndObject(); // for field 'name'
g.writeStringField("gender", Gender.MALE);
g.writeBooleanField("verified", false);
g.writeFieldName("userImage"); // no 'writeBinaryField' (yet?)
byte[] binaryData = ...;
g.writeBinary(binaryData);
g.writeEndObject();

 读操作:

Java代码 复制代码 收藏代码
  1. ReadJSON.java   
  2. JsonFactory f = new JsonFactory();   
  3. JsonParser jp = f.createJsonParser(new File("user.json"));   
  4. User user = new User();   
  5. jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)   
  6. while (jp.nextToken() != JsonToken.END_OBJECT) {   
  7.   String fieldname = jp.getCurrentName();   
  8.   jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY   
  9.   if ("name".equals(fieldname)) { // contains an object   
  10.     Name name = new Name();   
  11.     while (jp.nextToken() != JsonToken.END_OBJECT) {   
  12.       String namefield = jp.getCurrentName();   
  13.       jp.nextToken(); // move to value   
  14.       if ("first".equals(namefield)) {   
  15.         name.setFirst(jp.getText());   
  16.       } else if ("last".equals(namefield)) {   
  17.         name.setLast(jp.getText());   
  18.       } else {   
  19.         throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");   
  20.       }   
  21.     }   
  22.     user.setName(name);   
  23.   } else if ("gender".equals(fieldname)) {   
  24.     user.setGender(Gender.valueOf(jp.getText()));   
  25.   } else if ("verified".equals(fieldname)) {   
  26.     user.setVerified(jp.getCurrentToken() == JsonToken.VALUE_TRUE);   
  27.   } else if ("userImage".equals(fieldname)) {   
  28.     user.setUserImage(jp.getBinaryValue());   
  29.   } else {   
  30.     throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");   
  31.   }   
  32. }  
ReadJSON.java
JsonFactory f = new JsonFactory();
JsonParser jp = f.createJsonParser(new File("user.json"));
User user = new User();
jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)
while (jp.nextToken() != JsonToken.END_OBJECT) {
  String fieldname = jp.getCurrentName();
  jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY
  if ("name".equals(fieldname)) { // contains an object
    Name name = new Name();
    while (jp.nextToken() != JsonToken.END_OBJECT) {
      String namefield = jp.getCurrentName();
      jp.nextToken(); // move to value
      if ("first".equals(namefield)) {
        name.setFirst(jp.getText());
      } else if ("last".equals(namefield)) {
        name.setLast(jp.getText());
      } else {
        throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
      }
    }
    user.setName(name);
  } else if ("gender".equals(fieldname)) {
    user.setGender(Gender.valueOf(jp.getText()));
  } else if ("verified".equals(fieldname)) {
    user.setVerified(jp.getCurrentToken() == JsonToken.VALUE_TRUE);
  } else if ("userImage".equals(fieldname)) {
    user.setUserImage(jp.getBinaryValue());
  } else {
    throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
  }
}

 

数据绑定:

Java代码 复制代码 收藏代码
  1. //读   
  2. ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally   
  3. User user = mapper.readValue(new File("user.json"), User.class);   
  4.   
  5. //写   
  6. mapper.writeValue(<SPAN class=code-keyword>new</SPAN>   
  7.   
  8.   
  9.  File(<SPAN class=code-quote>"user-modified.json"</SPAN>   
  10.   
  11.   
  12. ), user);  
//读
ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
User user = mapper.readValue(new File("user.json"), User.class);

//写
mapper.writeValue(new


 File("user-modified.json"


), user);

 无类型的数据绑定:

Java代码 复制代码 收藏代码
  1. HashMap<String,Object> untyped = new HashMap<String,Object>();   
  2. HashMap<String,String> nameStruct = new HashMap<String,String>();   
  3. nameStruct.put("first""Joe");   
  4. nameStruct.put("last""Sixpack");   
  5. untyped.put("name", nameStruct);   
  6. untyped.put("gender""MALE");   
  7. untyped.put("verified", Boolean.FALSE);   
  8. untyped.put("userImage""Rm9vYmFyIQ==");  
HashMap<String,Object> untyped = new HashMap<String,Object>();
HashMap<String,String> nameStruct = new HashMap<String,String>();
nameStruct.put("first", "Joe");
nameStruct.put("last", "Sixpack");
untyped.put("name", nameStruct);
untyped.put("gender", "MALE");
untyped.put("verified", Boolean.FALSE);
untyped.put("userImage", "Rm9vYmFyIQ==");

 

树模型:

可以使用Stream API或者数据绑定的方式写或者ObjectMapper读取树树结构

ObjectMapper的方式:

 

Java代码 复制代码 收藏代码
  1. ObjectMapper m = new ObjectMapper();   
  2. // can either use mapper.readTree(JsonParser), or bind to JsonNode   
  3. JsonNode rootNode = m.readValue(new File("user.json"), JsonNode.class);   
  4. // ensure that "last name" isn't "Xmler"; if is, change to "Jsoner"   
  5. JsonNode nameNode = rootNode.path("name");   
  6. String lastName = nameNode.path("last").getTextValue().   
  7. if ("xmler".equalsIgnoreCase(lastName)) {   
  8.   ((ObjectNode)nameNode).put("last""Jsoner");   
  9. }   
  10. // and write it out:   
  11. m.writeValue(new File("user-modified.json"), rootNode);  
ObjectMapper m = new ObjectMapper();
// can either use mapper.readTree(JsonParser), or bind to JsonNode
JsonNode rootNode = m.readValue(new File("user.json"), JsonNode.class);
// ensure that "last name" isn't "Xmler"; if is, change to "Jsoner"
JsonNode nameNode = rootNode.path("name");
String lastName = nameNode.path("last").getTextValue().
if ("xmler".equalsIgnoreCase(lastName)) {
  ((ObjectNode)nameNode).put("last", "Jsoner");
}
// and write it out:
m.writeValue(new File("user-modified.json"), rootNode);

 

绝招:可以在JsonParser和JsonGenerator中直接使用数据绑定或者树模型的方式的,看一下以下方法就知道怎么用了

  • JsonParser.readValueAs()
  • JsonParser.readValueAsTree()
  • JsonGenerator.writeObject()
  • JsonGenerator.writeTree()
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics