我正在try 使用铁 rust 中的serde和csv crate 将嵌套的JSON对象转换为CSV文件.例如,我有一个 struct 定义,如

struct Foo {
 bar: Bar
}

struct Bar {
 baz: String,
 qux: String
}

这正在被反序列化.我希望序列化的CSV头看起来像

bar_baz, bar_qux

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

如果有像这样的东西

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

我可以把它放在wine 吧场地上,那将是最完美的.

推荐答案

我不认为在启用自动标题的情况下可以做到这一点.启用自动标题时,serialize function in csv::Writer对嵌套数据有一些限制.如果您禁用它并自己编写标头名称,这是一种方法:

#[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相关问答推荐

将数组中的值作为键连接到另一个数组中的值(Jolt)

JQ如何获取特定子元素的所有父母

JQ:获取该值的较短语法是什么

PostgreSQL:删除 JSONB 数组中每个元素的特定键

将不带正文的 CURL POST 转换为 RESTRequest Delphi 代码 / 为 Dropbox API /get_current_account 端点编写 Delphi 代码

转换为Json时忽略内部对象中的数组

jq EOF 处的无效数字文字将 json 值更新为 0.0.x

try 使用 JQ 转换 JSON 中过于复杂的对象数组

使用 jq 获取特定键的所有父键

当值包含ansible中的字符串时解析json值

JBuilder中未定义的局部变量或方法json

如何判断字符串是否为json格式

使用 boost 属性树读取 int 数组

从 Postgres 中的 json 对象中提取键、值

如何使用 jq 将 JSON 对象流转换为数组

Android JSON 库的性能和可用性比较

Rails 中奇怪的 JSON Javascript 问题

如何自动修复无效的 JSON 字符串?

我应该如何处理 JSON 中的 HATEOAS 链接和引用?

MVC JsonResult camelCase 序列化