流式写入 JSON 文件

问题描述 投票:0回答:1

我正在我的项目中实现 JSON 导出功能。早些时候,我在内存中构建 JSON(通过将数据存储在结构中)并使用

serde_json::to_string(data)
将它们写入目标文件。但现在 JSON 结构变得太大,无法容纳在内存中,因此我使用数据库streaming一次处理一行。

我想要生成的 JSON 具有如下结构:

{
   "measurements": [
      { "timestamp": "2023-10-23", "value": 123.54 },
      { "timestamp": "2023-10-24", "value": 123.54 },
      // a lot more similar entries
   ],   
   "media": [
      { "name": "Ugly Love", "author": "Colleen Hoover" },
      { "name": "Harry Potter", "author": "JK Rowling" },
      // a lot more similar entries
   ]
}

我觉得 ld-json 格式在这里不起作用,因为它具有平面文件结构。

如何将来自数据库的数据流式传输到 json 文件中?

json rust export serde sea-orm
1个回答
0
投票

将大量 JSON 数据从数据库流式传输到文件而不将其全部存储在内存中可能很困难,特别是如果数据具有分层结构(如您的情况)。为了实现这一点,您必须保留正确的 JSON 格式,同时在从数据库获取数据时逐渐将 JSON 写入文件。

Rust 中的示例,假设您有一个返回行的名为stream_from_db 的数据库函数,以及一个名为 serde_json::to_string 的序列化方法。

use serde_json;
use std::fs::File;
use std::io::{Write, BufWriter};

let file = File::create("output.json").unwrap();
let mut writer = BufWriter::new(file);

writer.write_all(b"{\"measurements\": [").unwrap();

let mut first = true;
for measurement in stream_from_db("measurements") {
    if !first {
        writer.write_all(b", ").unwrap();
    }
    first = false;

    let json = serde_json::to_string(&measurement).unwrap();
    writer.write_all(json.as_bytes()).unwrap();
}

writer.write_all(b"], \"media\": [").unwrap();

let mut first = true;
for media in stream_from_db("media") {
    if !first {
        writer.write_all(b", ").unwrap();
    }
    first = false;

    let json = serde_json::to_string(&media).unwrap();
    writer.write_all(json.as_bytes()).unwrap();
}

writer.write_all(b"]}").unwrap();
© www.soinside.com 2019 - 2024. All rights reserved.