gpt4 book ai didi

json - 支持 serde_json::Value 和 cbor_json::Value

转载 作者:行者123 更新时间:2023-12-03 11:36:56 24 4
gpt4 key购买 nike

如果我有一个未知布局的 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 反序列化到这个结构中?

最佳答案

好的,我试过了 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这似乎是为这种事情设计的,尽管我还没有尝试过。

关于json - 支持 serde_json::Value 和 cbor_json::Value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64169686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com