解析Java的Jackson庫中Streaming API的使用
流式API讀取和寫入JSON內(nèi)容離散事件。 JsonParser讀取數(shù)據(jù),而JsonGenerator寫入數(shù)據(jù)。它是三者中最有效的方法,是最低開銷和最快的讀/寫操作。它類似于XML的Stax解析器。
在本文中,我們將展示的使用Jackson的流式API 讀寫JSON數(shù)據(jù)。流式API工作使用JSON為每一個(gè)細(xì)節(jié)的都是要小心處理。下面的例子將使用兩個(gè)類:
JsonGenerator類——寫入JSON字符串。
sonGenerator是定義公共API編寫的Json內(nèi)容的基類。使用JsonFactory實(shí)例的工廠方法創(chuàng)建實(shí)例。
類聲明
以下是org.codehaus.jackson.JsonGenerator類的聲明:
public abstract class JsonGenerator extends Object implements Closeable
嵌套類
| S.N. | 類和說明 |
|---|---|
| 1 | static class JsonGenerator.Feature//枚舉定義了生成器的所有togglable功能。 |
字段
protected PrettyPrinter _cfgPrettyPrinter - 對(duì)象處理相當(dāng)打印(通常多余的空白,使結(jié)果更加可讀)輸出時(shí)。
構(gòu)造函數(shù)
| S.N. | 類和說明 |
|---|---|
| 1 | Default constructor |
JsonParser類——解析JSON字符串。
JsonParser是定義公共API用于讀取的Json內(nèi)容的基類。使用JsonFactory實(shí)例的工廠方法創(chuàng)建實(shí)例。
類聲明
以下是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 - 對(duì)象處理相當(dāng)打印(通常多余的空白,使結(jié)果更加可讀)輸出。
- protected JsonToken _currToken - 通過nextToken()檢索最后一個(gè)令牌(如有)。
- protected int _features - 位標(biāo)志位,表明其已啟用JsonParser.Features構(gòu)成。
- protected JsonToken _lastClearedToken - 最后清除令牌如果有的話:也就是值有效時(shí)clearCurrentToken()被調(diào)用。
構(gòu)造函數(shù)
| S.N. | 類和說明 |
|---|---|
| 1 | protected JsonParser() //默認(rèn)的構(gòu)造函數(shù) |
| 2 | protected JsonParser(int features) |
繼承的方法
這個(gè)類繼承了以下類方法:
java.lang.Object
使用JsonGenerator寫入JSON
使用JsonGenerator是非常簡(jiǎn)單的。首先使用JsonFactory.createJsonGenerator()方法創(chuàng)建一個(gè)JsonGenerator,并用write***()方法來寫每一個(gè)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)建一個(gè)名為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();
}
}
}
驗(yàn)證結(jié)果
使用javac編譯如下類:
C:\Jackson_WORKSPACE>javac JacksonTester.java
現(xiàn)在運(yùn)行jacksonTester看到的結(jié)果:
C:\Jackson_WORKSPACE>java JacksonTester
驗(yàn)證輸出
Mahesh Kumar 21 false [100, 90, 85]
使用JsonParser 讀取JSON
使用JsonParser是非常簡(jiǎn)單的。首先使用JsonFactory.createJsonParser()方法創(chuàng)建JsonParser,并使用它的nextToken()方法來讀取每個(gè)JSON字符串作為標(biāo)記。檢查每個(gè)令牌和相應(yīng)的過程。
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)建一個(gè)名為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();
}
}
}
驗(yàn)證結(jié)果
編譯使用javac編譯如下類:
C:\Jackson_WORKSPACE>javac JacksonTester.java
現(xiàn)在運(yùn)行 jacksonTester 看到結(jié)果如下:
C:\Jackson_WORKSPACE>java JacksonTester
驗(yàn)證輸出
Mahesh Kumar 21 false [100, 90, 85]
相關(guān)文章
SpringBoot構(gòu)造器注入循環(huán)依賴及解決方案
這篇文章主要介紹了SpringBoot構(gòu)造器注入循環(huán)依賴及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
詳談java線程與線程、進(jìn)程與進(jìn)程間通信
下面小編就為大家?guī)硪黄斦刯ava線程與線程、進(jìn)程與進(jìn)程間通信。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
解決org.apache.ibatis.binding.BindingException:?Invalid?boun
這篇文章主要介紹了解決org.apache.ibatis.binding.BindingException:?Invalid?bound?statement?(not?found)問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
SpringData @Query和@Modifying注解原理解析
這篇文章主要介紹了SpringData @Query和@Modifying注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
java.math包下計(jì)算浮點(diǎn)數(shù)和整數(shù)的類的實(shí)例
這篇文章主要介紹了java.math包下計(jì)算浮點(diǎn)數(shù)和整數(shù)的類的實(shí)例代碼,本文通過使用BigDecimal進(jìn)行浮點(diǎn)數(shù)比較給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02

