`
seawavecau
  • 浏览: 756708 次
  • 性别: 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()
分享到:
评论

相关推荐

    Jackson 入门Jackson 入门

    以下是关于Jackson入门的关键知识点: 1. **Streaming API**: - Jackson的Streaming API提供了一种低级、高性能的方式来处理JSON,适合大数据量或内存有限的情况。 - `JsonParser`用于读取JSON数据,而`...

    jackson快速入门

    这篇“Jackson快速入门”将带你快速掌握Jackson的核心功能和使用方法。 首先,我们需要了解Jackson的基本组件。核心组件包括`Jackson-databind`,它提供了`ObjectMapper`类,用于实现对象到JSON和JSON到对象的转换...

    Jackson实例入门

    在本篇文章中,我们将通过实例来入门Jackson的使用。 一、Jackson库简介 Jackson库的核心组件包括: 1. `Jackson-databind`:提供将Java对象映射到JSON和从JSON反序列化回Java对象的功能。 2. `Jackson-core`:基础...

    jackson电动力学习题答案

    尽管Jackson的《Classical Electrodynamics》在某些方面可能不是最理想的入门教材,但它仍然是一个非常宝贵的资源,特别是对于那些希望深入了解经典电动力学领域的学生而言。通过系统地学习、广泛地查阅参考资料并...

    jackson经典电动力学部分习题答案

    然而,它并非完美的入门教材。该书在某些地方假设了读者对基础材料的熟悉度,省略了关键步骤,并且提供的实例不足。对于初学者而言,这可能是一本难以消化的书籍。然而,Jackson的野心在于他几乎涵盖了经典电磁理论...

    jackson电动力学答案

    2. 尽管该书内容详尽、研究充分,但普遍存在一个普遍观点,即该书并非一个好的入门级教材。它在某些章节假设读者已具备先验知识,跳过了一些关键步骤,并且提供的例子不够充分。 3. Jackson的书在作为参考资料方面...

    Google Android开发入门与实战(pdf和源代码)

    JSON作为数据交换格式,需要理解其结构并能使用Gson或Jackson进行解析。存储数据时,可以使用SQLite数据库或SharedPreferences进行轻量级数据保存,对于大量数据,考虑使用ContentProvider或云存储。 本书还涵盖了...

    Ehcache分布式缓存入门案例demo_文件转树结构_

    本入门案例将带你了解如何使用Ehcache实现分布式缓存,并特别关注如何将文件数据转换为树形结构。 首先,让我们理解Ehcache的基本概念。Ehcache的核心组件包括缓存管理器(Cache Manager)、缓存(Cache)和缓存项...

    JSON入门实战 (JAVA版)

    本教程将带你入门JSON,并通过Java进行实战操作。 一、JSON基本结构 1. JSON对象:由花括号{}包围,内部包含键值对,键与值之间用冒号隔开,键值对之间用逗号分隔。键必须是字符串,而值可以是各种数据类型,如字符...

    jackson-patch:使用 Jackson 的 HTTP 补丁 (RFC 6902) 实现

    &lt; dependency&gt; &lt; groupId&gt;io.progix.jackson&lt;/ groupId&gt; &lt; artifactId&gt;jackson-patch&lt;/ artifactId&gt; &lt; version&gt;0.1.0&lt;/ version&gt;&lt;/ dependency&gt; ##入门所有补丁操作都可以使用JsonPatch类的静态方法来执行。...

    spring boot入门例子

    例如,如果检测到`spring-boot-starter-web`,那么它就会自动配置Web相关的设置,包括DispatcherServlet、Jackson JSON序列化等。 3. **嵌入式服务器(Embedded Server)**:Spring Boot 支持嵌入式Servlet容器,如...

    android开发从入门到精通光盘源代码

    学习如何使用HttpURLConnection或OkHttp发送网络请求,以及使用Gson或Jackson解析返回的JSON数据,是网络编程的基础。 12. **异步处理**:Android主线程不能执行耗时操作,否则会导致应用无响应。理解并使用...

    GSON入门篇(教学视频+源代码)

    GSON入门篇 一、创建一个JavaSE项目 二、IDEA中导入gson的jar包 三、创建JavaBean 四、测试类 4.1 一个对象转JSON 4.2 多个对象转JSON 4.3 JSON字符串转一个对象 4.4 JSON字符串转多个对象(List) 4.4.1 错误案例 ...

    android从入门到精通ppt

    2. JSON解析:将JSON数据转换为Java对象,如使用Gson或Jackson库。 3. Retrofit与RxJava:现代的网络请求库结合响应式编程,提高异步处理效率。 八、服务与广播接收器 1. Service:后台运行的服务,了解启动服务和...

    JAVA-基础入门教程

    Java中可以使用如Jackson、Gson等库进行JSON的解析和序列化。 通过阅读《基于Java操作的JSON入门教程.pdf》和《JAVA-基础入门教程.pdf》,你可以深入理解这些概念,并通过实践编写简单的Java程序,逐渐熟悉这个强大...

    Android开发入门与实战体验-ppt

    - **JSON解析**:Gson或Jackson库可将JSON数据转换为Java对象,方便处理。 5. **服务与广播** - **服务(Service)**:后台运行的任务,即使用户离开应用仍能继续执行。 - **广播接收器(BroadcastReceiver)**:...

    网络爬虫入门到精通

    同时,如果遇到JSON或XML数据,需要了解Jackson或Gson库来解析这些结构化数据。 网络爬虫常常需要处理反爬虫策略,比如验证码、动态加载内容、IP限制等。对于这些问题,我们可能需要用到Selenium、Puppeteer等工具...

    安卓 入门到精通 开发文档

    在进阶部分,文档可能包含网络编程,如使用OkHttp或Retrofit进行HTTP请求,以及使用Gson或Jackson进行JSON数据解析。还有数据库管理,如SQLite的使用,以及如何实现数据持久化。另外,可能还会涉及到异步处理,如...

    Android开发从入门到精通].扶松柏.扫描版

    此外,还会讲解网络编程,如使用HttpURLConnection或OkHttp进行网络请求,以及使用Gson或Jackson进行JSON解析。 此外,Android的生命周期管理和多线程处理也是重点内容。理解Activity和Fragment的生命周期对于避免...

Global site tag (gtag.js) - Google Analytics