20个版本

0.0.117 2024年4月20日
0.0.116 2024年4月20日
0.0.108 2024年3月30日

#2366编码

MIT/Apache

1MB
23K SLoC

musli-serde

github crates.io docs.rs build status

使用serde类型在Müsli中的不透明垫片。

这可以通过标记它们为#[musli(with = musli_serde)],方便且透明地让Müsli使用字段。这很有用,因为有一个广泛的类型生态系统实现了serde特性和功能。

请注意,字段序列化和反序列化的确切方法不会与Müsli的相同,因为serde需要使用一个根本不同的模型,而Müsli元数据,如#[musli(name = ..)],在serde中不可用。


示例

use serde::{Serialize, Deserialize};
use musli::{Encode, Decode};
use url::Url;

#[derive(Serialize, Deserialize)]
struct Address {
    street: String,
    city: String,
    zip: u32,
}

#[derive(Encode, Decode)]
#[musli(name_all = "name")]
struct Person {
    name: String,
    #[musli(with = musli_serde)]
    address: Address,
    #[musli(with = musli_serde)]
    url: Url,
}

兼容的Müsli结构将如下所示

use musli::{Encode, Decode};
use url::Url;

#[derive(Encode, Decode)]
#[musli(name_all = "name")]
struct MusliAddress {
    street: String,
    city: String,
    zip: u32,
}

#[derive(Encode, Decode)]
#[musli(name_all = "name")]
struct MusliPerson {
    name: String,
    address: MusliAddress,
    url: String,
}

let json = musli_json::to_string(&Person {
    name: "John Doe".to_string(),
    address: Address {
        street: "Main St.".to_string(),
        city: "Springfield".to_string(),
        zip: 12345,
    },
    url: Url::parse("https://example.com")?,
})?;

let musli = musli_json::from_str::<MusliPerson>(&json)?;

assert_eq!(musli.name, "John Doe");
assert_eq!(musli.address.street, "Main St.");
assert_eq!(musli.address.city, "Springfield");
assert_eq!(musli.address.zip, 12345);
assert_eq!(musli.url, "https://example.com/");

依赖项

~0.4–1MB
~24K SLoC