#serde-json #serialization #json

序列化器

轻松为同一类型创建多个序列化器

7 个版本

使用旧的 Rust 2015

0.2.3 2018 年 11 月 17 日
0.2.2 2018 年 11 月 12 日
0.1.2 2018 年 9 月 30 日

#5 in #serializes

MIT 许可证

21KB
316

序列化器

Build Status Crates.io Documentation

通常在使用 "serde_json" 和 #[derive(Serialize)] 时,您只能为一种类型拥有一个 JSON 表示,然而有时您可能需要另一个具有更多或更少数据的表示。

此软件包使得创建将一些值转换为 JSON 的 "序列化器" 变得简单。您可以为每个序列化器决定它序列化哪种类型以及哪些字段和关联。

安装

[dependencies]
serializers = "0.2.3"

示例

#[macro_use]
extern crate serializers;
#[macro_use]
extern crate serde_json;

use serializers::*;

struct User {
    id: u64,
    name: String,
    country: Country,
    friends: Vec<User>,
}

#[derive(Clone)]
struct Country {
    id: u64,
}

serializer! {
    #[derive(Debug, Copy, Clone)]
    struct UserSerializer<User> {
        attr(id)
        attr(name)
        has_one(country, CountrySerializer)
        has_many(friends, UserSerializer)
    }
}

serializer! {
    #[derive(Debug, Copy, Clone)]
    struct CountrySerializer<Country> {
        attr(id)
    }
}

fn main() {
    let denmark = Country {
        id: 1,
    };

    let bob = User {
        id: 1,
        name: "Bob".to_string(),
        country: denmark.clone(),
        friends: vec![
            User {
                id: 2,
                name: "Alice".to_string(),
                country: denmark.clone(),
                friends: vec![],
            }
        ],
    };

    let json: String = UserSerializer::serialize(&bob);

    assert_eq!(
        json,
        json!({
            "country": { "id": 1 },
            "friends": [
                {
                    "country": { "id": 1 },
                    "friends": [],
                    "name": "Alice",
                    "id": 2
                }
            ],
            "name": "Bob",
            "id": 1
        }).to_string(),
    );
}

有关更多信息,请参阅 API 文档

依赖项

~355–760KB
~17K SLoC