引言

继《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相关推荐

  1. 使用JackJSON 流式API 创建JSON串【学习记录】

    教程网址:Jackson流式API 目标JSON串 原始JSON串 核心代码 思路:先将原始JSON串生成对应的对象,获取到其数据 package com.run.runlpwebdemo.utils ...

  2. java流式api,Java 8 中流式API性能基准测试

    测试代码 package hello.test; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; ...

  3. 简易的动物园管理系统之Java8流式API的重构代码(使用 门面设计模式)

    文章目录 前言 之前的文章 本次的源码 AnimalTypeEnum SexEnum Animal AnimalFactory BaseAnimal Bird Cat Dog Fish AddAnim ...

  4. Jackson高级操作————节点树

    引言 继<Jackson快速入门>基础篇之后的树模型相关操作. 节点树模型 ObjectMapper构建JsonNode节点树,类似于DOM解析器的XML. @Testpublic voi ...

  5. 简易的动物园管理系统之Java8流式API的重构代码(使用 状态设计模式)

    文章目录 前言 项目结构 java 代码 AbstractAnimal Cat Dog Leg Swim ZooManager RunTest Client 程序运行 结果展示 最后 修改 Clien ...

  6. java 流常用接口_java 8新特性5--使用集合流式API

    PS:向公众号发送关键字可以搜索文章哦! 使用集合的流式API 直接上代码了,常用api都有了,要点都在注释中 苹果类: packagejava8.stream;/***@authorqiang.xi ...

  7. ChatGPT流式传输(stream=True)的实现-OpenAI API 流式传输

    文章目录 一.介绍: 二.不足之处: 三.示例代码: 0. 引入库: 1. 不使用stream的后台代码(官方示例): 2. 使用stream的后台代码(官方示例): 3. 实际生产环境的示例后台代码 ...

  8. Java Stream流式编程

    流式编程Stream 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通,在节点被处理. 流[无存储],流不是一种数据结构 ...

  9. 【Java】流式编程学习笔记

    文章目录 一.流简介 二.创建流 2.1 由值创建流:of 2.2 由列表创建流:stream 2.3 由 Builder 创建流:build 2.4 由文件生成流:lines 2.5 由函数生成流 ...

最新文章

  1. MinkowskiBroadcast广播
  2. c语言运动会成绩统计报告,C语言程序设计运动会成绩统计系统1研究报告.doc
  3. [解决方案]sql server复制需要有实际的服务器名称才能连接到服务器
  4. android 如何做记住密码
  5. 聊聊我的高效学习法,让你快速拿下算法、MySQL…每天只花半小时
  6. 【Spring MVC 中 HandlerInterceptorAdapter的使用】
  7. centos6.9下安装composer
  8. 云计算再次升温 百度亮剑
  9. java分隔符的引号,使用分隔符拆分带引号的字符串
  10. kafka偏移量保存到mysql里_Kafka 新版消费者 API(二):提交偏移量
  11. Javascript this关键字 指向详解
  12. hdu4353 Finding Mine三角形内的点数
  13. 腾讯游戏与NVIDIA合作发布START云游戏服务
  14. 事务隔离级别神话与误解
  15. 2019年12月中国编程语言排行和薪资分析
  16. 游戏筑基开发之变量、运算符、转义字符的注意点(C语言)
  17. const 使用方法具体解释
  18. 【免积分下载】吴恩达 机器学习笔记PDF版v5.5.pdf
  19. 模仿京东分类页面的布局
  20. 汽车行业营销案例(共13份)

热门文章

  1. Node出错导致运行崩溃的解决方案
  2. JavaScript禁用页面刷新
  3. c# 获取电脑硬件信息通用查询类[测试通过]
  4. kubernetes 实战 使用 nfs 作为动态 storageClass 存储
  5. Xftp上传文件显示状态错误
  6. java变量用来干嘛_Java
  7. 5怎么选国外节点_外卖包装怎么选?这5个技巧要掌握
  8. 安费诺amphenol连接器_安费诺的Ellison谈信号完整性职业和他的免费开源PCB设计软??件...
  9. java开发环境怎么写_Java开发基础设置:如何配置Java运行环境
  10. win7系统任务管理器如何强制关闭程序