6 个版本

0.1.6 2023年4月27日
0.1.5 2023年4月21日

#797编码

Download history 28/week @ 2024-03-14 2/week @ 2024-03-28 1/week @ 2024-04-04

86 每月下载量

Apache-2.0

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