Java流式解析json_解析Java的Jackson库中Streaming API的使用

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

发布于 2020-3-28|

复制链接

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

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

sonGenerator是定义公共API编写的Json内容的基类。使用JsonFactory实例的工厂方法创建实例。类声明

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

```java

public abstract class JsonGenerator

extends Object

implements Closeable

```

嵌套类

S.N.

类和说明

1

static class JsonGenerator.Feature//枚举定义了生成器的所有togglable功能。

构造函数

S.N.

类和说明

1

Default constructor

JsonParser类——解析JSON字符串。

JsonParser是定义公共API用于读取的Json内容的基类。使用JsonFactory实例的工厂方法创建实例。类声明

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

```java

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

```java

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

```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 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

复制代码 代码如下:

C:\Jackson_WORKSPACE>java JacksonTester

```plain

Mahesh Kumar

21

false

[100, 90, 85]

```

使用JsonParser 读取JSON

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

```java

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

```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

复制代码 代码如下:

C:\Jackson_WORKSPACE>java JacksonTester

```plain

Mahesh Kumar

21

false

[100, 90, 85]

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值