[英]Support both serde_json::Value and cbor_json::Value
如果我有未知布局的JSON值我可以deserialise它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 反序列化到这个结构中?
好的,我试过serde(untagged)
,它有点工作,除了它总是导致UnknownValue::Json
,即使你使用 serde_cbor 反序列化。 我不确定它是如何工作的:
use serde::Deserialize;
#[derive(Deserialize, Debug)]
#[serde(untagged)]
enum UnknownValue {
Json(serde_json::Value),
Cbor(serde_cbor::Value),
}
#[derive(Deserialize, Debug)]
struct Foo {
unknown: UnknownValue,
}
fn main() {
let json_input = br#"{"unknown": 23}"#;
let cbor_input = [0xA1, 0x67, 0x75, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x17];
let j: Foo = serde_json::from_slice(json_input).unwrap();
let c: Foo = serde_cbor::from_slice(&cbor_input).unwrap();
dbg!(j);
dbg!(c);
}
印刷
[src/main.rs:21] j = Foo {
unknown: Number(
23,
),
}
[src/main.rs:22] c = Foo {
unknown: Number(
23,
),
}
所以我想知道如果你使用serde_json::Value
并忘记枚举,它是否只是有效,而且,它确实有效! 使用它会给出完全相同的输出:
#[derive(Deserialize, Debug)]
struct Foo {
unknown: serde_json::Value,
}
所以这并不能回答我的实际问题(例如,如果您想获得 CBOR 标签),但它确实满足了我的用例。 可能还值得一提的是serde-value ,它似乎是为这种事情设计的,尽管我还没有尝试过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.