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. }  
 

  JSon数据:

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

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();  

 读操作:

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. }  

 

数据绑定:

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);  

 无类型的数据绑定:

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==");  

 

树模型:

可以使用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);  

 

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

  • JsonParser.readValueAs()
  • JsonParser.readValueAsTree()
  • JsonGenerator.writeObject()
  • JsonGenerator.writeTree()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值