首页 > 编程 > Java > 正文

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

2019-11-26 14:41:08
字体:
来源:转载
供稿:网友

流式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 Kumar21false[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 Kumar21false[100, 90, 85]

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表