解析Java的Jackson庫中Streaming API的使用
流式API讀取和寫入JSON內(nèi)容離散事件。 JsonParser讀取數(shù)據(jù),而JsonGenerator寫入數(shù)據(jù)。它是三者中最有效的方法,是最低開銷和最快的讀/寫操作。它類似于XML的Stax解析器。
在本文中,我們將展示的使用Jackson的流式API 讀寫JSON數(shù)據(jù)。流式API工作使用JSON為每一個細節(jié)的都是要小心處理。下面的例子將使用兩個類:
JsonGenerator類——寫入JSON字符串。
sonGenerator是定義公共API編寫的Json內(nèi)容的基類。使用JsonFactory實例的工廠方法創(chuàng)建實例。
類聲明
以下是org.codehaus.jackson.JsonGenerator類的聲明:
public abstract class JsonGenerator extends Object implements Closeable
嵌套類
| S.N. | 類和說明 |
|---|---|
| 1 | static class JsonGenerator.Feature//枚舉定義了生成器的所有togglable功能。 |
字段
protected PrettyPrinter _cfgPrettyPrinter - 對象處理相當打印(通常多余的空白,使結(jié)果更加可讀)輸出時。
構(gòu)造函數(shù)
| S.N. | 類和說明 |
|---|---|
| 1 | Default constructor |
JsonParser類——解析JSON字符串。
JsonParser是定義公共API用于讀取的Json內(nèi)容的基類。使用JsonFactory實例的工廠方法創(chuàng)建實例。
類聲明
以下是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 //枚舉可用于數(shù)字可能的“本地”(最佳)類型。 |
字段
- protected PrettyPrinter _cfgPrettyPrinter - 對象處理相當打印(通常多余的空白,使結(jié)果更加可讀)輸出。
- protected JsonToken _currToken - 通過nextToken()檢索最后一個令牌(如有)。
- protected int _features - 位標志位,表明其已啟用JsonParser.Features構(gòu)成。
- protected JsonToken _lastClearedToken - 最后清除令牌如果有的話:也就是值有效時clearCurrentToken()被調(diào)用。
構(gòu)造函數(shù)
| S.N. | 類和說明 |
|---|---|
| 1 | protected JsonParser() //默認的構(gòu)造函數(shù) |
| 2 | protected JsonParser(int features) |
繼承的方法
這個類繼承了以下類方法:
java.lang.Object
使用JsonGenerator寫入JSON
使用JsonGenerator是非常簡單的。首先使用JsonFactory.createJsonGenerator()方法創(chuàng)建一個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操作。創(chuàng)建一個名為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();
}
}
}
驗證結(jié)果
使用javac編譯如下類:
C:\Jackson_WORKSPACE>javac JacksonTester.java
現(xiàn)在運行jacksonTester看到的結(jié)果:
C:\Jackson_WORKSPACE>java JacksonTester
驗證輸出
Mahesh Kumar 21 false [100, 90, 85]
使用JsonParser 讀取JSON
使用JsonParser是非常簡單的。首先使用JsonFactory.createJsonParser()方法創(chuàng)建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的操作。創(chuàng)建一個名為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();
}
}
}
驗證結(jié)果
編譯使用javac編譯如下類:
C:\Jackson_WORKSPACE>javac JacksonTester.java
現(xiàn)在運行 jacksonTester 看到結(jié)果如下:
C:\Jackson_WORKSPACE>java JacksonTester
驗證輸出
Mahesh Kumar 21 false [100, 90, 85]
相關文章
java自定義任務類定時執(zhí)行任務示例 callable和future接口使用方法
Callable是類似于Runnable的接口,實現(xiàn)Callable接口的類和實現(xiàn)Runnable的類都是可被其它線程執(zhí)行的任務2014-01-01
詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置
本篇文章主要介紹了詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
SpringBoot 2.0 整合sharding-jdbc中間件實現(xiàn)數(shù)據(jù)分庫分表
這篇文章主要介紹了SpringBoot 2.0 整合sharding-jdbc中間件,實現(xiàn)數(shù)據(jù)分庫分表,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-06-06
Java Spring使用hutool的HttpRequest發(fā)送請求的幾種方式
文章介紹了Hutool庫中用于發(fā)送HTTP請求的工具,包括添加依賴、發(fā)送GET和POST請求的方法,以及GET請求的不同參數(shù)傳遞方式,感興趣的朋友跟隨小編一起看看吧2024-11-11
springboot讀取nacos配置文件的實現(xiàn)
SpringBoot注冊服務到Nacos上,由Nacos來做服務的管理,本文主要介紹了springboot讀取nacos配置文件的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05

