簡體   English   中英

支持 serde_json::Value 和 cbor_json::Value

[英]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,
}

但是如果我想要一個可以從 JSONCBOR 加載的單一數據結構呢? 我實際上想要這個:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM