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相关推荐
- 使用JackJSON 流式API 创建JSON串【学习记录】
教程网址:Jackson流式API 目标JSON串 原始JSON串 核心代码 思路:先将原始JSON串生成对应的对象,获取到其数据 package com.run.runlpwebdemo.utils ...
- java流式api,Java 8 中流式API性能基准测试
测试代码 package hello.test; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; ...
- 简易的动物园管理系统之Java8流式API的重构代码(使用 门面设计模式)
文章目录 前言 之前的文章 本次的源码 AnimalTypeEnum SexEnum Animal AnimalFactory BaseAnimal Bird Cat Dog Fish AddAnim ...
- Jackson高级操作————节点树
引言 继<Jackson快速入门>基础篇之后的树模型相关操作. 节点树模型 ObjectMapper构建JsonNode节点树,类似于DOM解析器的XML. @Testpublic voi ...
- 简易的动物园管理系统之Java8流式API的重构代码(使用 状态设计模式)
文章目录 前言 项目结构 java 代码 AbstractAnimal Cat Dog Leg Swim ZooManager RunTest Client 程序运行 结果展示 最后 修改 Clien ...
- java 流常用接口_java 8新特性5--使用集合流式API
PS:向公众号发送关键字可以搜索文章哦! 使用集合的流式API 直接上代码了,常用api都有了,要点都在注释中 苹果类: packagejava8.stream;/***@authorqiang.xi ...
- ChatGPT流式传输(stream=True)的实现-OpenAI API 流式传输
文章目录 一.介绍: 二.不足之处: 三.示例代码: 0. 引入库: 1. 不使用stream的后台代码(官方示例): 2. 使用stream的后台代码(官方示例): 3. 实际生产环境的示例后台代码 ...
- Java Stream流式编程
流式编程Stream 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通,在节点被处理. 流[无存储],流不是一种数据结构 ...
- 【Java】流式编程学习笔记
文章目录 一.流简介 二.创建流 2.1 由值创建流:of 2.2 由列表创建流:stream 2.3 由 Builder 创建流:build 2.4 由文件生成流:lines 2.5 由函数生成流 ...
最新文章
- MinkowskiBroadcast广播
- c语言运动会成绩统计报告,C语言程序设计运动会成绩统计系统1研究报告.doc
- [解决方案]sql server复制需要有实际的服务器名称才能连接到服务器
- android 如何做记住密码
- 聊聊我的高效学习法,让你快速拿下算法、MySQL…每天只花半小时
- 【Spring MVC 中 HandlerInterceptorAdapter的使用】
- centos6.9下安装composer
- 云计算再次升温 百度亮剑
- java分隔符的引号,使用分隔符拆分带引号的字符串
- kafka偏移量保存到mysql里_Kafka 新版消费者 API(二):提交偏移量
- Javascript this关键字 指向详解
- hdu4353 Finding Mine三角形内的点数
- 腾讯游戏与NVIDIA合作发布START云游戏服务
- 事务隔离级别神话与误解
- 2019年12月中国编程语言排行和薪资分析
- 游戏筑基开发之变量、运算符、转义字符的注意点(C语言)
- const 使用方法具体解释
- 【免积分下载】吴恩达 机器学习笔记PDF版v5.5.pdf
- 模仿京东分类页面的布局
- 汽车行业营销案例(共13份)
热门文章
- Node出错导致运行崩溃的解决方案
- JavaScript禁用页面刷新
- c# 获取电脑硬件信息通用查询类[测试通过]
- kubernetes 实战 使用 nfs 作为动态 storageClass 存储
- Xftp上传文件显示状态错误
- java变量用来干嘛_Java
- 5怎么选国外节点_外卖包装怎么选?这5个技巧要掌握
- 安费诺amphenol连接器_安费诺的Ellison谈信号完整性职业和他的免费开源PCB设计软??件...
- java开发环境怎么写_Java开发基础设置:如何配置Java运行环境
- win7系统任务管理器如何强制关闭程序