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