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

 更新时间:2016年01月13日 10:57:19   投稿:goldensun  
这篇文章主要介绍了解析Java的Jackson库中Streaming API的使用,Jackson被用于Java对象和JSON的互相转换,需要的朋友可以参考下

流式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]

相关文章

  • Java8 Stream flatmap中间操作用法解析

    Java8 Stream flatmap中间操作用法解析

    这篇文章主要介绍了Java8 Stream flatmap中间操作用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java给实体每一个字段赋默认值详细代码示例

    Java给实体每一个字段赋默认值详细代码示例

    这篇文章主要给大家介绍了关于Java给实体每一个字段赋默认值的相关资料,在编程过程中有时会出现这样一种情况,在查询无结果时我们需要给实体赋默认值,需要的朋友可以参考下
    2023-09-09
  • 微信公众号开发消息推送功能

    微信公众号开发消息推送功能

    微信公众号分为服务号、订阅号、企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以,这篇文章主要介绍了微信公众号开发消息推送功能,需要的朋友可以参考下
    2023-02-02
  • 根据ID填充文本框的实例代码

    根据ID填充文本框的实例代码

    这篇文章介绍了根据ID填充文本框的小例子,有需要的朋友可以参考一下
    2013-07-07
  • Spring依赖注入DI之三种依赖注入类型详解

    Spring依赖注入DI之三种依赖注入类型详解

    这篇文章主要介绍了Spring依赖注入DI之三种依赖注入类型详解,通过 @Autowired 注解,字段注入的实现方式非常简单而直接,代码的可读性也很强,事实上,字段注入是三种注入方式中最常用、也是最容易使用的一种,需要的朋友可以参考下
    2023-09-09
  • SpringBoot集成JWT实现token验证的流程

    SpringBoot集成JWT实现token验证的流程

    Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).这篇文章主要介绍了SpringBoot集成JWT实现token验证,需要的朋友可以参考下
    2020-01-01
  • Java网络编程之IO模型阻塞与非阻塞简要分析

    Java网络编程之IO模型阻塞与非阻塞简要分析

    这篇文章主要介绍Java网络编程中的IO模型阻塞与非阻塞简要分析,文中附有示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • java8 forEach结合Lambda表达式遍历 List操作

    java8 forEach结合Lambda表达式遍历 List操作

    这篇文章主要介绍了java8 forEach结合Lambda表达式遍历 List操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringMVC的自定义拦截器详解

    SpringMVC的自定义拦截器详解

    这篇文章主要介绍了SpringMVC的自定义拦截器详解,拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的,需要的朋友可以参考下
    2023-07-07
  • SpringMVC中文乱码踩坑记录

    SpringMVC中文乱码踩坑记录

    这篇文章主要介绍了SpringMVC中文乱码踩坑记录,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08

最新评论