考虑这个Config
包含结构向量的Host
结构:
use serde::Deserialize;
use std::net::IpAddr;
#[derive(Debug, Deserialize)]
struct Config {
name: String,
hosts: Vec<Host>
}
#[derive(Debug, Deserialize)]
struct Host {
addr: IpAddr,
user: String,
}
使用派生的Deserialize
实现,可以使用serde_json
和成功反序列化以下 JSON 和 YAML 配置文件serde_yaml
:
{
"name": "example",
"hosts": [
{ "addr": "1.1.1.1", "user": "alice" },
{ "addr": "2.2.2.2", "user": "bob" }
]
}
---
name: example
hosts:
- addr: 1.1.1.1
user: alice
- addr: 2.2.2.2
user: bob
但是,我还希望能够Host
从字符串反序列化结构。但是,重要的是我还可以从地图反序列化它,理想情况下,矢量可以由两种格式组成。例如:
{
"name": "example",
"hosts": [
"alice@1.1.1.1",
{ "addr": "2.2.2.2", "user": "bob" }
]
}
---
name: example
hosts:
- alice@1.1.1.1
- addr: 2.2.2.2
user: bob
在结构#[serde(try_from = "String")]
之上Host
,我可以轻松地支持字符串反序列化......但是它不再反序列化地图格式。
serde 网站有一个关于反序列化字符串或结构的页面deserialize_with
,但它需要只能应用于字段(而不是结构容器)的属性。我不确定这种技术是否可行,因为我的领域是 aVec<Host>
而不仅仅是 a Host
。
这有可能实现吗?