20个版本
0.0.117 | 2024年4月20日 |
---|---|
0.0.116 | 2024年4月20日 |
0.0.108 | 2024年3月30日 |
#2366 在 编码
1MB
23K SLoC
musli-serde
使用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