簡體   English   中英

如何將serde_json :: Value轉換為實現Deserialize trait的具體類型?

[英]How to convert serde_json::Value into concrete type implementing Deserialize trait?

我正在編寫一個websocket服務器,它將傳入的幀反序列化為serde_json::Value ,然后將此值傳遞給(可能很多)回調。 我希望回調將serde_json::Value轉換為新類型(例如下面示例中的MyType ),而不進行編碼/解碼傳遞。 在我看來,serde機器應該有足夠的信息來做到這一點(如果包含的字段和類型不匹配,可能會出錯)。 在下面的示例中,函數to_my_type()代表此回調函數。 是我想從這個功能中繞過的編碼/解碼。

我當然可以將原始編碼數據傳遞給每個回調,但是每個回調都必須單獨進行解碼。 我想保留回調的函數簽名采用類型為serde_json::Value的參數,以便不同的回調可以獲得不同的類型,但我可以使用公共函數簽名注冊它們。

#![feature(proc_macro)]

#[macro_use]
extern crate serde_derive;
extern crate serde_json;

#[derive(Serialize, Deserialize)]
struct MyType {
    a: bool,
}

fn as_json(a: &MyType) -> serde_json::Value {
    let buf = serde_json::to_vec(a).unwrap();
    serde_json::from_slice::<serde_json::Value>(&buf).unwrap()
}

fn to_my_type(value: serde_json::Value) -> MyType {
    // How to convert a serde_json::Value into MyType without encode/decode pass?
    let buf = serde_json::to_vec(&value).unwrap();
    serde_json::from_slice::<MyType>(&buf).unwrap()
}

fn main() {
    let store = MyType{a: true};
    let raw_json = as_json(&store);
    let _store2 = to_my_type(raw_json);
}

您可以使用serde_json::from_value函數將Value轉換為實現Deserialize任何類型:

fn to_my_type(value: serde_json::Value) -> MyType {
    serde_json::from_value(value).unwrap()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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