流式API读取和写入JSON内容离散事件。 JsonParser读取数据,而JsonGenerator写入数据。它是三者中最有效的方法,是最低开销和最快的读/写操作。它类似于XML的Stax解析器。
在本文中,我们将展示的使用Jackson的流式API 读写JSON数据。流式API工作使用JSON为每一个细节的都是要小心处理。下面的例子将使用两个类:
JsonGenerator类——写入JSON字符串。
sonGenerator是定义公共API编写的Json内容的基类。使用JsonFactory实例的工厂方法创建实例。
类声明
以下是org.codehaus.jackson.JsonGenerator类的声明:
1
2
3
|
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类的声明:
1
2
3
|
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值。
1
2
3
4
5
6
7
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
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
验证输出
1
2
3
4
|
Mahesh Kumar 21 false [100, 90, 85] |
使用JsonParser 读取JSON
使用JsonParser是非常简单的。首先使用JsonFactory.createJsonParser()方法创建JsonParser,并使用它的nextToken()方法来读取每个JSON字符串作为标记。检查每个令牌和相应的过程。
1
2
3
4
5
6
7
8
9
10
11
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
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
验证输出
1
2
3
4
|
Mahesh Kumar 21 false [100, 90, 85] |