用jackson转json

有时您需要将大量数据导出到JSON到文件中。 也许是“将所有数据导出到JSON”,或者是GDPR“可移植性的权利”,您实际上需要这样做。

与任何大型数据集一样,您不能只将其全部容纳在内存中并将其写入文件。 这需要一段时间,它会从数据库中读取大量条目,并且您需要注意不要使此类导出使整个系统超载或耗尽内存。

幸运的是,借助Jackson的SequenceWriter和可选的管道流,这样做非常简单。 看起来像这样:

private ObjectMapper jsonMapper = new ObjectMapper();private ExecutorService executorService = Executors.newFixedThreadPool(5);@Asyncpublic ListenableFuture<Boolean> export(UUID customerId) {try (PipedInputStream in = new PipedInputStream();PipedOutputStream pipedOut = new PipedOutputStream(in);GZIPOutputStream out = new GZIPOutputStream(pipedOut)) {Stopwatch stopwatch = Stopwatch.createStarted();ObjectWriter writer = jsonMapper.writer().withDefaultPrettyPrinter();try(SequenceWriter sequenceWriter = writer.writeValues(out)) {sequenceWriter.init(true);Future<?> storageFuture = executorService.submit(() ->storageProvider.storeFile(getFilePath(customerId), in));int batchCounter = 0;while (true) {List<Record> batch = readDatabaseBatch(batchCounter++);for (Record record : batch) {sequenceWriter.write(entry);}}// wait for storing to completestorageFuture.get();}  logger.info("Exporting took {} seconds", stopwatch.stop().elapsed(TimeUnit.SECONDS));return AsyncResult.forValue(true);} catch (Exception ex) {logger.error("Failed to export data", ex);return AsyncResult.forValue(false);}}

该代码可以做一些事情:

  • 使用SequenceWriter连续写入记录。 它使用OutputStream初始化,所有内容均写入其中。 这可以是简单的FileOutputStream,也可以是如下所述的管道流。 注意,这里的命名有点误导– writeValues(out)听起来就像您在指示编写者现在写东西; 而是将其配置为以后使用特定的流。
  • SequenceWritertrue初始化,表示“包装在数组中”。 您正在编写许多相同的记录,因此它们应在最终JSON中表示一个数组。
  • 使用PipedOutputStreamPipedInputStreamSequenceWriter链接到InputStream ,然后将InputStream传递到存储服务。 如果我们明确地使用文件,则不需要这样做-只需传递FileOutputStream就可以。 但是,您可能想要以不同的方式存储文件,例如在Amazon S3中,并且putObject调用需要一个InputStream,从该InputStream可以读取数据并将其存储在S3中。 因此,实际上,您正在写入一个OutputStream,而该OutputStream会直接写入InputStream,当被输入以读取该输入流时,会将所有内容写入另一个OutputStream
  • 存储文件是在单独的线程中调用的,因此写入文件不会阻塞当前线程,当前线程的目的是从数据库中读取数据。 同样,如果使用简单的FileOutputStream,则不需要这样做。
  • 整个方法被标记为@Async(spring),因此它不会阻止执行-它被调用并在准备就绪时完成(使用内部Spring executor服务和有限的线程池)
  • 这里未显示数据库批处理读取代码,因为它随数据库的不同而不同。 关键是,您应该分批提取数据,而不是SELECT * FROMX。
  • OutputStream包装在GZIPOutputStream中,因为带有重复元素的JSON之类的文本文件可从压缩中显着受益

主要工作是由Jackson的SequenceWriter完成的,(显而易见的)要点是–不要假设您的数据适合内存。 它几乎永远不会做,所以批量处理和增量写入都是如此。

翻译自: https://www.javacodegeeks.com/2018/08/writing-big-json-files-jackson.html

用jackson转json

用jackson转json_用Jackson编写大JSON文件相关推荐

  1. Atitit 大json文件的结构化查看解决方案,高性能的jsonview  attilax总结.docx

    Atitit 大json文件的结构化查看解决方案,高性能的jsonview  attilax总结.docx 1.1. 实现目标:1 1.2. 实现key与value类型的..一直分析到非 jsonob ...

  2. 大(json)文件压缩(minify)

    文章目录 Preface 解决方案 Preface 现在在做一个 GIS 地图的项目, 做过地图的应该就知道各省/市/县的json文件有多大(大部分都是经纬度数据), 就直接放前台public目录下了 ...

  3. 用Jackson编写大型JSON文件

    有时您需要将大量数据导出到JSON到文件中. 可能是"将所有数据导出到JSON",或者是GDPR"可移植性权利",您实际上需要这样做. 与任何大型数据集一样,您 ...

  4. python逐行读取json_如何用python读取json文件里指定的数据

    JSON文件who.json内容如下:{"name":"mss","version":"1.0.0","des ...

  5. 安卓大json文件解析_安卓解析 json 4种格式 全解析

    1  简单的一个  { ,,,,} 2  里面有数组 { , [{,,},{,,}],} 3 直接一个数组 4 数组里有数组 5 其他情况? 没有吧,除非json格式不规范 主代码: package ...

  6. java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...

    java+解析未知json 使用Jackson API在Java中解析JSON时的常见问题之一是,当您的JSON包含未知属性(即您的Java类没有对应于所有JSON属性的所有字段)时,该操作将失败. ...

  7. Jackson学习二之集合类对象与JSON互相转化--转载

    原文地址:http://lijingshou.iteye.com/blog/2003059 本篇主要演示如何使用Jackson对List, Map和数组与JSON互相转换. package com.j ...

  8. 怎么用c语言表示大整数的四则运算,用c语言编写大整数的四则运算,求大神

    用c语言编写大整数的四则运算,求大神 答案:3  信息版本:手机版 解决时间 2019-10-03 17:13 已解决 2019-10-03 01:32 用c语言编写大整数的四则运算,求大神 最佳答案 ...

  9. java编写大数据分析模型_如何用Java(DOM分析器)编写XML文件

    java编写大数据分析模型 Earlier we learned how to read XML file and how to edit XML file in java using DOM Par ...

最新文章

  1. redis安装教程 windows环境
  2. ThreadPoolExecutor的execute源码分析
  3. Python Cookbook手记I
  4. NonEmpty和Hierarchize嵌套的bug
  5. 捕鱼小游戏html源码,html5捕鱼达人小游戏源码
  6. 最佳75个安全工具介绍及其下载地址
  7. 软件测试之 app测试的工具汇总
  8. SQLmap简单的使用——新手教程解析
  9. FPS通用的方框透视公式的原理
  10. 微信服务号如何创建一个带参数的微信二维码?
  11. 制作一个类“全能扫描王”的简易扫描软件(opencv)
  12. 电路交换、报文交换、分组交换三种数据交换方式的特点、优点、应用场景以及技术对比分析
  13. python random.round 修约方法 4舍6入5看齐,奇进偶不进
  14. JS 逆向之 Hook
  15. CSP M4 B ZJM要抵御宇宙射线
  16. 电脑组成部件介绍图解之电脑由哪些部件组成?各个部件作用又是什么 ?主要功能是什么?
  17. Matlab语音信号去噪程序,使用低通巴特沃斯滤波器
  18. UVA:10118 Free Candies
  19. 从《我不是药神》说起
  20. 如何将竖屏视频转换为横屏,横屏转为竖屏

热门文章

  1. test2 3-16 2021 模拟赛two
  2. [学习笔记] 初次见面,请多关照 (公式推导+题集)——杜教筛
  3. 欢乐纪中A组赛【2019.8.20】
  4. nssl1195-健美猫【???】
  5. P3899 [湖南集训]更为厉害(线段树合并、长链剖分、二维数点)
  6. 【线段树】海报(loj 3264)
  7. JavaFX仿windows文件管理器目录树
  8. 汇编语言(二十四)之输出n行星号
  9. 一文带你理解Java中Lock的实现原理
  10. Java开发2018年值得学习的10大技术