解析Java的Jackson库中Streaming API的使用

流式API读取和写入JSON内容离散事件。 JsonParser读取数据,而JsonGenerator写入数据。它是三者中最有效的方法,是最低开销和最快的读/写操作。它类似于XML的Stax解析器。

在本文中,我们将展示的使用Jackson的流式API 读写JSON数据。流式API工作使用JSON为每一个细节的都是要小心处理。下面的例子将使用两个类:
JsonGenerator类——写入JSON字符串。
sonGenerator是定义公共API编写的Json内容的基类。使用JsonFactory实例的工厂方法创建实例。

类声明
以下是org.codehaus.jackson.JsonGenerator类的声明:

public abstract class JsonGenerator
  extends Object
   implements Closeable

嵌套类

S.N. 类和说明
1 static class JsonGenerator.Feature//枚举定义了生成器的所有togglable功能。

字段
protected PrettyPrinter _cfgPrettyPrinter - 对象处理相当打印(通常多余的空白,使结果更加可读)输出时。

构造函数

S.N. 类和说明
1 Default constructor

JsonParser类——解析JSON字符串。
JsonParser是定义公共API用于读取的Json内容的基类。使用JsonFactory实例的工厂方法创建实例。

类声明
以下是org.codehaus.jackson.JsonParser类的声明:

public abstract class JsonParser
  extends Object
   implements Closeable, Versioned

嵌套类

S.N. 类和说明
1 static class JsonParser.Feature //枚举定义了解析器的所有togglable功能。
2 static class JsonParser.NumberType //枚举可用于数字可能的“本地”(最佳)类型。

字段

  • protected PrettyPrinter _cfgPrettyPrinter - 对象处理相当打印(通常多余的空白,使结果更加可读)输出。
  • protected JsonToken _currToken - 通过nextToken()检索最后一个令牌(如有)。
  • protected int _features - 位标志位,表明其已启用JsonParser.Features构成。
  • protected JsonToken _lastClearedToken - 最后清除令牌如果有的话:也就是值有效时clearCurrentToken()被调用。

构造函数

S.N. 类和说明
1 protected JsonParser() //默认的构造函数
2 protected JsonParser(int features)

继承的方法
这个类继承了以下类方法:

代码如下:

java.lang.Object

使用JsonGenerator写入JSON
使用JsonGenerator是非常简单的。首先使用JsonFactory.createJsonGenerator()方法创建一个JsonGenerator,并用write***()方法来写每一个JSON值。

JsonFactory jasonFactory = new JsonFactory();
JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File(
  "student.json"), JsonEncoding.UTF8);
// {
jsonGenerator.writeStartObject();
// "name" : "Mahesh Kumar"
jsonGenerator.writeStringField("name", "Mahesh Kumar");

让我们来看看JsonGenerator操作。创建一个名为JacksonTester的Java类文件在目录 C:\>Jackson_WORKSPACE.

File: JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.Map;

import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonTester {
  public static void main(String args[]){
   JacksonTester tester = new JacksonTester();
   try {
     JsonFactory jasonFactory = new JsonFactory();

     JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File(
      "student.json"), JsonEncoding.UTF8);
     // {
     jsonGenerator.writeStartObject();
     // "name" : "Mahesh Kumar"
     jsonGenerator.writeStringField("name", "Mahesh Kumar");
     // "age" : 21
     jsonGenerator.writeNumberField("age", 21);
     // "verified" : false
     jsonGenerator.writeBooleanField("verified", false);
     // "marks" : [100, 90, 85]
     jsonGenerator.writeFieldName("marks");
     // [
     jsonGenerator.writeStartArray();
     // 100, 90, 85
     jsonGenerator.writeNumber(100);
     jsonGenerator.writeNumber(90);
     jsonGenerator.writeNumber(85);
     // ]
     jsonGenerator.writeEndArray();
     // }
     jsonGenerator.writeEndObject();
     jsonGenerator.close();     

     //result student.json
     //{
     //  "name":"Mahesh Kumar",
     //  "age":21,
     //  "verified":false,
     //  "marks":[100,90,85]
     //}
     ObjectMapper mapper = new ObjectMapper();
     Map<String,Object> dataMap = mapper.readValue(new File("student.json"), Map.class);

     System.out.println(dataMap.get("name"));
     System.out.println(dataMap.get("age"));
     System.out.println(dataMap.get("verified"));
     System.out.println(dataMap.get("marks"));
   } catch (JsonParseException e) {
     e.printStackTrace();
   } catch (JsonMappingException e) {
     e.printStackTrace();
   } catch (IOException e) {
     e.printStackTrace();
   }
  }
}

验证结果

使用javac编译如下类:

代码如下:

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行jacksonTester看到的结果:

代码如下:

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Mahesh Kumar
21
false
[100, 90, 85]

使用JsonParser 读取JSON
使用JsonParser是非常简单的。首先使用JsonFactory.createJsonParser()方法创建JsonParser,并使用它的nextToken()方法来读取每个JSON字符串作为标记。检查每个令牌和相应的过程。

JsonFactory jasonFactory = new JsonFactory();
JJsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json"));
while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
  //get the current token
  String fieldname = jsonParser.getCurrentName();
  if ("name".equals(fieldname)) {
   //move to next token
   jsonParser.nextToken();
   System.out.println(jsonParser.getText());
  }
}

让我们来看看JsonParser的操作。创建一个名为JacksonTester在Java类在文件夹 C:\>Jackson_WORKSPACE.

文件: JacksonTester.java

import java.io.File;
import java.io.IOException;

import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;
import org.codehaus.jackson.map.JsonMappingException;

public class JacksonTester {
  public static void main(String args[]){
   JacksonTester tester = new JacksonTester();
   try {
     JsonFactory jasonFactory = new JsonFactory();

     JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File(
      "student.json"), JsonEncoding.UTF8);
     jsonGenerator.writeStartObject();
     jsonGenerator.writeStringField("name", "Mahesh Kumar");
     jsonGenerator.writeNumberField("age", 21);
     jsonGenerator.writeBooleanField("verified", false);
     jsonGenerator.writeFieldName("marks");
     jsonGenerator.writeStartArray(); // [
     jsonGenerator.writeNumber(100);
     jsonGenerator.writeNumber(90);
     jsonGenerator.writeNumber(85);
     jsonGenerator.writeEndArray();
     jsonGenerator.writeEndObject();
     jsonGenerator.close();     

     //result student.json
     //{
     //  "name":"Mahesh Kumar",
     //  "age":21,
     //  "verified":false,
     //  "marks":[100,90,85]
     //}

     JsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json"));
     while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
      //get the current token
      String fieldname = jsonParser.getCurrentName();
      if ("name".equals(fieldname)) {
        //move to next token
        jsonParser.nextToken();
        System.out.println(jsonParser.getText());
      }
      if("age".equals(fieldname)){
        //move to next token
        jsonParser.nextToken();
        System.out.println(jsonParser.getNumberValue());
      }
      if("verified".equals(fieldname)){
        //move to next token
        jsonParser.nextToken();
        System.out.println(jsonParser.getBooleanValue());
      }
      if("marks".equals(fieldname)){
        //move to [
        jsonParser.nextToken();
        // loop till token equal to "]"
        while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
         System.out.println(jsonParser.getNumberValue());
        }
      }
     }
   } catch (JsonParseException e) {
     e.printStackTrace();
   } catch (JsonMappingException e) {
     e.printStackTrace();
   } catch (IOException e) {
     e.printStackTrace();
   }
  }
}

验证结果

编译使用javac编译如下类:

代码如下:

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 看到结果如下:

代码如下:

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Mahesh Kumar
21
false
[100, 90, 85]
(0)

相关推荐

  • 解析Java的Jackson库中对象的序列化与数据泛型绑定

    Jackson对象序列化 这里将介绍将Java对象序列化到一个JSON文件,然后再读取JSON文件获取转换为对象.在这个例子中,创建了Student类.创建将有学生对象以JSON表示在一个student.json文件. 创建一个名为JacksonTester在Java类文件在 C:\>Jackson_WORKSPACE. 文件: JacksonTester.java import java.io.File; import java.io.IOException; import org.codeh

  • Java的Jackson库中复杂对象集合的几种简单转换

    话不多说,请看代码: package com; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxm

  • 实例解析Java的Jackson库中的数据绑定

    数据绑定API用于JSON转换和使用属性访问或使用注解POJO(普通Java对象).以下是它的两个类型. 简单数据绑定 - 转换JSON,从Java Maps, Lists, Strings, Numbers, Booleans 和 null 对象. 完整数据绑定 - 转换JSON到任何JAVA类型.我们将在下一章分别绑定. ObjectMapper读/写JSON两种类型的数据绑定.数据绑定是最方便的方式是类似XML的JAXB解析器. 简单的数据绑定 简单的数据绑定是指JSON映射到Java核心

  • 使用Jackson来实现Java对象与JSON的相互转换的教程

    一.入门 Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换. 1.JAVA对象转JSON[JSON序列化] import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonDemo { p

  • 举例讲解Java的Jackson库中ObjectMapper类的使用

    ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象匹配JSON结构,反之亦然.它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写. 类声明 以下是org.codehaus.jackson.map.ObjectMapper类的声明: public class ObjectMapper extends ObjectCodec implements Versioned 嵌套类 S.N. 类 & 描述 1 static class

  • Java的Jackson库的使用及其树模型的入门学习教程

    Jackson第一个程序 在进入学习jackson库的细节之前,让我们来看看应用程序操作功能.在这个例子中,我们创建一个Student类.将创建一个JSON字符串学生的详细信息,并将其反序列化到学生的对象,然后将其序列化到JSON字符串. 创建一个名为JacksonTester在Java类文件 C:\>Jackson_WORKSPACE. 文件: JacksonTester.java import java.io.IOException; import org.codehaus.jackson.

  • 解析Java的Jackson库中Streaming API的使用

    流式API读取和写入JSON内容离散事件. JsonParser读取数据,而JsonGenerator写入数据.它是三者中最有效的方法,是最低开销和最快的读/写操作.它类似于XML的Stax解析器. 在本文中,我们将展示的使用Jackson的流式API 读写JSON数据.流式API工作使用JSON为每一个细节的都是要小心处理.下面的例子将使用两个类: JsonGenerator类--写入JSON字符串. sonGenerator是定义公共API编写的Json内容的基类.使用JsonFactory

  • Jackson库中objectMapper的用法

    Jackson库中objectMapper用法 ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象与SON结构互相转换,在项目中遇到过,故记录一下. 在 pom.xml 加入依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>

  • 解析Java的Hibernate框架中的持久化类和映射文件

    持久化类 Hibernate的整个概念是采取从Java类属性的值,并将持久到数据库表.一个映射文件Hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域. 其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类. Hibernate的效果最好,如果这些类遵循一些简单的规则,也称为普通Java对象(POJO)编程模型.有下列持久化类的主要规则,但是,这些规则并不是必需的. 将所有的持久化Java类需要一个默认的构造函数. 所有类应该包含为了让容易识别对象内H

  • 深入解析Java的Hibernate框架中的持久对象

    一.持久对象生命周期 应用程序在使用Hibernate框架后,创建的持久对象会经历一整套生命周期来完成数据库的操作,其中主要的三个状态分别是瞬态(Transient).持久化(Persistent).脱管(detached).这三种状态的转换是能够在应用程序中控制的,如下图: 为了能清楚的了解这几种状态,这里使用一个实例来查看下这几种状态下对象的不同,下面状态内的代码,具体步骤如下: (1)创建Hibernate_session程序集,并添加像相应的jar包: (2)配置Hibernate,添加

  • 深入解析Java的Spring框架中bean的依赖注入

    每一个基于java的应用程序都有一个共同工作来展示给用户看到的内容作为工作的应用几个对象.当编写一个复杂的Java应用程序,应用程序类应该尽可能独立其他Java类来增加重复使用这些类,并独立于其他类别的测试它们,而这样做单元测试的可能性.依赖注入(或有时称为布线)有助于粘合这些类在一起,同时保持他们的独立. 考虑有其中有一个文本编辑器组件的应用程序,要提供拼写检查.标准的代码将看起来像这样: public class TextEditor { private SpellChecker spell

随机推荐