【发布时间】:2020-10-02 10:00:36
【问题描述】:
如果我有一个布局未知的 JSON 值,我可以使用 serde_json 使用 serde_json::Value 反序列化它:
#[derive(Deserialize)]
struct Foo {
unknown: serde_json::Value,
}
同样,我可以对 CBOR 做同样的事情:
#[derive(Deserialize)]
struct Foo {
unknown: serde_cbor::Value,
}
但是,如果我想要一个可以从 JSON 或 CBOR 加载的单一数据结构怎么办。我实际上想要这个:
enum UnknownValue {
Json(serde_json::Value),
Cbor(serde_cbor::Value),
}
#[derive(Deserialize)]
struct Foo {
unknown: UnknownValue,
}
有什么方法可以将 JSON 或 CBOR 反序列化到这个结构中?
【问题讨论】:
-
使用 untagged 肯定是有问题的地方
-
@Stargateur 我不知道这些是否适用,
serde(untagged)用于反序列化“正确的”锈级枚举,但他们想要的是从两个完全不同的反序列化通用无类型/非结构化值序列化库(json 和 cbor)。由于 cbor 数据类型看起来是 json 的超集,我建议将serde_json::Value转换为serde_cbor::Value并始终使用后者。或者,如果需要转换回来,您可能想做相反的事情(将有效的 cbor 输入限制为 json 兼容)。