rust 是否可以将原始字符串直接反序列化为特定类型?

huus2vyu  于 2023-02-23  发布在  其他
关注(0)|答案(3)|浏览(118)

我搜索了一下,似乎找不到这个问题的答案,所以这可能是一个重复。
我有一个String,如下所示(实际的字符串不是文字):

let param_type_raw = String::from("address");

我想把它反序列化为ethabi::ParamType类型,它实现了Deserializer trait。

let param_type: ParamType = serde_json::from_str(format!("\"{}\"", param_type_raw).as_str())?;

但是,将字符串转换为JSON字符串以便将其反序列化为ParamType似乎是极其多余的,我确信一定有更好的方法可以单独反序列化String

wi3ka0sx

wi3ka0sx1#

更一般地回答标题:serde::de::value模块中的每个原语类型都有一套反序列化器,可以使用IntoDeserializer trait提供的.into_deserializer()创建这些原语类型。
所以如果你有一个字符串,并且你知道你的类型可以从字符串反序列化,你可以这样做:

use ethabi::ParamType;
use serde::de::value::Error;
use serde::de::{Deserialize, IntoDeserializer};

fn main() {
    let param_type_raw = "address";
    let param_type: Result<_, Error> = ParamType::deserialize(param_type_raw.into_deserializer());
    println!("{:?}", param_type);
}
Ok(Address)

这有点烦人,因为反序列化器对错误类型是通用的,所以必须在某处指定一个,但这正是serde::de::value::Error的用途。

7fyelxc5

7fyelxc52#

这有一个特定的功能:

use ethabi::{param_type::Reader, ParamType};

fn main() {
    let param_type_raw = String::from("address");

    let param_type: ParamType = Reader::read(&param_type_raw).unwrap();
    println!("{:?}", param_type);
}
Address
oalqel3c

oalqel3c3#

let param_type_raw = "address";
let mode: ParamType = serde_json::from_str(&format!(r#"{}"#, param_type_raw)).unwrap();

或者

let param_type_raw = "address";
let mode: ParamType = serde_json::from_str(&format!("\"{}\"", param_type_raw)).unwrap();

相关问题