解析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-05SpringData @Query和@Modifying注解原理解析
這篇文章主要介紹了SpringData @Query和@Modifying注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08java.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