[英]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.