Jackson高级操作————流式API与JsonGenerator、JsonParser
引言
繼《Jackson快速入門》之后的高級相關操作。
Jackson提供了一種對于性能要求應用程序操作json更加高效的方式——流式API,這種方式開銷小,性能高,因此,如果應用程序或者程序邏輯對于性能有一定要求,可以使用這種方式來進行json文件的讀寫操作,而對于一般的讀寫,使用普通的databind api即可。
要點
1、與Java8的“流式”概念不同,這種Jackson的這種流式是屬于IO流,在寫出與讀入的最后都要進行流的關閉 —— close()。
2、這種流式API(Streaming APIs),是一種高性能(high-performance)讀寫JSON的方式,同時也是一種增量模式(incremental mode)。
3、Token概念:使用流式API的時候,每一個JSON 字符串都是一個獨立的 token ,每一個token都會被增量處理(可以理解為一個一個地往上增加,類似于壘磚),這就是“增量模式”的含義。比如:
{"name" : "Morty" }Token 1 = "{"
Token 2 = "name"
Token 3 = "Morty"
Token 4 = "}"
4、流式API的缺點:雖然流式API在性能上有所特長,但是通過第三點,也可以知道,每一個token都是增量處理的,也就是說,我們必須要小心翼翼地處理每個token,這可能會因為粗心導致丟掉必要的token (如 "}"、"]" 等),而且代碼可能并不簡潔,可讀性也不一定好,因此,不到需要考慮性能的時候,一定不要使用這種方式。
示例程序
通過Jackson Streaming APIs,寫入一個json文件——“user.json”,并讀出。
@Testpublic void testJsonGenerator() throws IOException {JsonFactory factory = new JsonFactory();// -----------------JsonGenerator --------------------JsonGenerator gentor = factory.createGenerator(new File("user.json"), JsonEncoding.UTF8);gentor.writeStartObject(); // {gentor.writeStringField("name", "Tomson");gentor.writeNumberField("age", 23);gentor.writeFieldName("messages");gentor.writeStartArray(); // [gentor.writeString("msg1");gentor.writeString("msg2");gentor.writeString("msg3");gentor.writeEndArray(); // ]gentor.writeEndObject(); // }gentor.close();// ------------------JsonParser --------------------JsonParser parser = factory.createParser(new File("user.json"));while (parser.nextToken() != JsonToken.END_OBJECT) {String fieldName = parser.getCurrentName();if ("name".equals(fieldName)) {// current token is "name",move to next which is "name"'s value.parser.nextToken();System.out.println(parser.getText());// display "Tomson"}if ("age".equals(fieldName)) {parser.nextToken();System.out.println(parser.getIntValue());}if ("messages".equals(fieldName)) {parser.nextToken();// messages is array, loop until equals "]"while(parser.nextToken() != JsonToken.END_ARRAY) {System.out.println(parser.getText());}}}parser.close();}user.json文件內容:
程序執行輸出結果:
總結
Jackson Streaming APIs是一種高性能、增量式json讀寫工具,在需要特殊性能要求的時候才會用到。缺點是代碼不簡潔,易錯性高,可讀性較差,可以通過jackson data binding代替。
token的概念,每一個json字符串都要被視為token,包括表示對象的大括號以及表示數組的中括號。
操作結束需要關流——close()。
?
總結
以上是生活随笔為你收集整理的Jackson高级操作————流式API与JsonGenerator、JsonParser的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux问题处理————命令提示符显示
- 下一篇: LeetCode算法入门- Search