當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
用jackson转json_用Jackson编写大JSON文件
生活随笔
收集整理的這篇文章主要介紹了
用jackson转json_用Jackson编写大JSON文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用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)聽起來就像您在指示編寫者現在寫東西; 而是將其配置為以后使用特定的流。
- SequenceWriter用true初始化,表示“包裝在數組中”。 您正在編寫許多相同的記錄,因此它們應在最終JSON中表示一個數組。
- 使用PipedOutputStream和PipedInputStream將SequenceWriter鏈接到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文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps龟裂缝怎么设置(ps龟裂缝在哪里)
- 下一篇: oauth2.0授权码_OAUTH 2.