[英]How to fix the trait `std::convert::From<serde_json::Value>` is not implemented for `hyper::Body`?
[英]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.