可选择跳过使用 Serde 序列化字段?
Optionally skip serializing a field with Serde?
我有两个结构:
#[derive(Serialize)]
struct Post {
title: String,
// ...more fields...,
comments: Vec<Comment>,
}
#[derive(Serialize)]
struct Comment {
body: String,
// ...more fields...,
}
我想生成 2 种 JSON 文件:
Vec<Post>
的 JSON 索引,其中应包含除 comments
. 之外的所有字段
- A JSON of a
Post
其中包括所有字段。
是否可以使用 Serialize
派生属性实现此目的?我在 Serde 的文档中找到了 skip_serializing_if
属性,但据我所知,它对我没有用,因为我想跳过的不是基于字段的值,而是基于哪个 JSON 文件生成。
现在我正在使用 json!
宏生成索引,这需要手动列出 Post
的所有字段,但我希望有更好的方法来做到这一点。
I want to generate 2 kinds of JSON files
我读到的是“JSON 个文件的 2 类型 ”,所以我将其作为解决方案。我会创建适合每个上下文的包装器类型。这些可以引用原始类型以避免过多的内存开销:
#[derive(Serialize)]
struct LightweightPost<'a> {
title: &'a String,
}
impl<'a> From<&'a Post> for LightweightPost<'a> {
fn from(other: &'a Post) -> Self {
LightweightPost {
title: &other.title,
}
}
}
fn main() {
let posts = vec![
Post {
title: "title".into(),
comments: vec![Comment { body: "comment".into() }],
},
];
let listing: Vec<_> = posts.iter().map(LightweightPost::from).collect();
println!("{}", serde_json::to_string(&listing).unwrap());
// [{"title":"title"}]
println!("{}", serde_json::to_string(&posts[0]).unwrap());
// {"title":"title","comments":[{"body":"comment"}]}
}
在编辑方面,我发现这种类型的多类型结构在使用 Ruby 编写 Web 应用程序时非常有用,使用 roar gem。这些新类型允许在某些地方挂起特定上下文的行为,例如验证或持久性。
我有两个结构:
#[derive(Serialize)]
struct Post {
title: String,
// ...more fields...,
comments: Vec<Comment>,
}
#[derive(Serialize)]
struct Comment {
body: String,
// ...more fields...,
}
我想生成 2 种 JSON 文件:
Vec<Post>
的 JSON 索引,其中应包含除comments
. 之外的所有字段
- A JSON of a
Post
其中包括所有字段。
是否可以使用 Serialize
派生属性实现此目的?我在 Serde 的文档中找到了 skip_serializing_if
属性,但据我所知,它对我没有用,因为我想跳过的不是基于字段的值,而是基于哪个 JSON 文件生成。
现在我正在使用 json!
宏生成索引,这需要手动列出 Post
的所有字段,但我希望有更好的方法来做到这一点。
I want to generate 2 kinds of JSON files
我读到的是“JSON 个文件的 2 类型 ”,所以我将其作为解决方案。我会创建适合每个上下文的包装器类型。这些可以引用原始类型以避免过多的内存开销:
#[derive(Serialize)]
struct LightweightPost<'a> {
title: &'a String,
}
impl<'a> From<&'a Post> for LightweightPost<'a> {
fn from(other: &'a Post) -> Self {
LightweightPost {
title: &other.title,
}
}
}
fn main() {
let posts = vec![
Post {
title: "title".into(),
comments: vec![Comment { body: "comment".into() }],
},
];
let listing: Vec<_> = posts.iter().map(LightweightPost::from).collect();
println!("{}", serde_json::to_string(&listing).unwrap());
// [{"title":"title"}]
println!("{}", serde_json::to_string(&posts[0]).unwrap());
// {"title":"title","comments":[{"body":"comment"}]}
}
在编辑方面,我发现这种类型的多类型结构在使用 Ruby 编写 Web 应用程序时非常有用,使用 roar gem。这些新类型允许在某些地方挂起特定上下文的行为,例如验证或持久性。