`
hypgr
  • 浏览: 276826 次
社区版块
存档分类
最新评论

Jackson 入门

阅读更多

原文链接:

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类:

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; }  
}  
 
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数据:

   {  
  "name" : { "first" : "Joe", "last" : "Sixpack" },  
  "gender" : "MALE",  
  "verified" : false,  
  "userImage" : "Rm9vYmFyIQ=="  
 }  
 
{
  "name" : { "first" : "Joe", "last" : "Sixpack" },
  "gender" : "MALE",
  "verified" : false,
  "userImage" : "Rm9vYmFyIQ=="
}
 

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

写操作:

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

 读操作:

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+"'!");  
  }  
 
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+"'!");
  }
}

 

数据绑定:

//读  
ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally  
User user = mapper.readValue(new File("user.json"), User.class);  
  
//写  
mapper.writeValue(<span class="code-keyword">new</span>  
  
  
 File(<span class="code-quote">"user-modified.json"</span>  
  
  
), 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);

 无类型的数据绑定:

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==");
 
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的方式:

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

 

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的书在作为参考资料方面...

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

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

    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容器,如...

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

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

    JAVA-基础入门教程

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

    JSON入门实战 (JAVA版)

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

    网络爬虫入门到精通

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

    安卓 入门到精通 开发文档

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

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

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

    android从入门到精通ppt

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

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

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

    Android网络开发从入门到精通源码_张余

    本资料"Android网络开发从入门到精通源码"由张余提供,旨在帮助开发者系统地学习并掌握Android平台上的网络编程技术。 一、Android网络基础 在Android中,我们主要通过HttpURLConnection、HttpClient(已废弃)、...

    springboot入门,springboot-demo

    在这个名为"springboot-demo"的项目中,我们将深入探讨SpringBoot的基本概念、核心功能以及如何进行入门实践。 一、SpringBoot概述 SpringBoot是由Pivotal团队提供的全新框架,其设计目标是为了使创建独立的、生产...

Global site tag (gtag.js) - Google Analytics