6 个版本
0.1.6 | 2023年4月27日 |
---|---|
0.1.5 | 2023年4月21日 |
#797 在 编码
86 每月下载量
15KB
322 行
序列化数据视图
在序列化过程中动态选择包含哪些字段。
示例
use serde_view::View;
use serde_view::ViewFields;
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, View)]
pub struct MyStruct {
id: String,
#[serde(default)]
name: String,
#[serde(default)]
tags: Vec<String>,
}
fn serialize(my: &MyStruct) -> Result<serde_json::Value, serde_json::Error> {
serde_json::to_value(my.as_view().with_fields([
<MyStruct as View>::Fields::Id,
<MyStruct as View>::Fields::Name,
]).unwrap())
}
lib.rs
:
序列化结构体的视图
这个包的想法是只序列化结构体的子集字段,在运行时做出决定。
基本示例
假设你有一个结构体像这样
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct MyStruct {
id: String,
#[serde(default)]
name: String,
#[serde(default)]
tags: Vec<String>,
}
现在,你希望只序列化数据的子集,在运行时做出这个决定。这可以通过将 View
derive 添加到结构体中,并用 View::view
函数包装序列化,向视图上下文添加额外信息来实现
use serde_view::View;
use serde_view::ViewFields;
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, View)]
pub struct MyStruct {
id: String,
#[serde(default)]
name: String,
#[serde(default)]
tags: Vec<String>,
}
fn serialize(my: &MyStruct) -> Result<serde_json::Value, serde_json::Error> {
serde_json::to_value(my.as_view().with_fields([
<MyStruct as View>::Fields::Id,
<MyStruct as View>::Fields::Name,
]).unwrap())
}
fn serialize_str_fields(my: &MyStruct) -> Result<serde_json::Value, serde_json::Error> {
// as fields can be converted to strings, it is also possible to pass something like a
// comma separated list
serde_json::to_value(my.as_view().with_fields(
<MyStruct as View>::Fields::from_str_split("id,name").unwrap()
).unwrap())
}
依赖
~1.3–2MB
~40K SLoC