json - 使用 serde 和 csv crate 将嵌套的 json 对象序列化为 csv

标签 json csv rust serialization serde

我正在尝试使用 Rust 中的 serde 和 csv 包将嵌套的 JSON 对象转换为 csv 文件。例如,我有一个类似的结构定义

struct Foo {
 bar: Bar
}

struct Bar {
 baz: String,
 qux: String
}

正在反序列化。我希望序列化的 csv header 看起来像

bar_baz, bar_qux

像这样的扁平化似乎是一个非常常见的用例,但我在 serde 文档中找不到相关字段属性的任何标志。由于这是正在解析的更大 JSON 响应的一部分,因此我真的不想实现自己的序列化器。有没有快速完成此任务的方法?

如果有类似的事情

#[serde(flatten(serialize(prepend_field_name = true)))]

我可以把它放在酒吧区,那就完美了。

最佳答案

我认为启用自动 header 无法完成此操作。 serialize function in csv::Writer启用自动 header 时,对嵌套数据有一些限制。如果您禁用它并自己编写 header 名称,这是一种方法:

#[derive(serde::Serialize)]
struct Foo {
    bar: Bar,
}

#[derive(serde::Serialize)]
struct Bar {
    baz: String,
    qux: String,
}

fn main() {
    let mut writer = csv::WriterBuilder::new()
        .has_headers(false)
        .from_writer(Vec::new());
    writer.write_record(["bar_baz", "bar_qux"]).unwrap();
    writer
        .serialize(Foo {
            bar: Bar {
                baz: "baz 1".into(),
                qux: "qux 1".into(),
            },
        })
        .unwrap();
    writer
        .serialize(Foo {
            bar: Bar {
                baz: "baz 2".into(),
                qux: "qux 2".into(),
            },
        })
        .unwrap();

    println!(
        "{}",
        String::from_utf8(writer.into_inner().unwrap()).unwrap()
    );
}

输出:

bar_baz,bar_qux
baz 1,qux 1
baz 2,qux 2

Playground

关于json - 使用 serde 和 csv crate 将嵌套的 json 对象序列化为 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75945568/

相关文章:

javascript - 如何从 google map api 中的 json 文件中读取 json 数据

javascript - d3.js 简单的 csv 树形图两列

csv - gnuplot:仅使用最后 n 行

cocoa - 在 cocoa 中保存 CSV

容器对象的 Rust 模式

json - 将元素添加到 Postgres 中的 JSON 对象

node.js - 解析 '...THtwvnO2F9FWD7HrMJoGZ' 附近时 JSON 输入意外结束

rust - 覆盖 Rust 安装默认路径 `$HOME/.cargo` 和 `$HOME/.rustup`

javascript - 根据匹配键合并两个多维数组?

redis - 调用使用redis-rs创建redis连接的函数时如何防止生命周期问题