我正在使用 rust serde json 反序列化一些 json 字符串,由于某种原因(前端 javascript 无法处理 i64 数据类型,更多信息从这里:Javascript long integer),服务器端默认将 i64 转换为字符串。此默认操作使 rust 反序列化数据失败,这是显示此问题的最小演示:
use serde::{Serialize, Deserialize};
#[tokio::main]
async fn main() {
let text_response = "{\"id\":\"1\"}";
let resp_result = serde_json::from_str::<RdUserInfo>(&text_response);
if let Err(e) = resp_result {
print!("{}", e);
}
}
#[derive(Serialize, Deserialize)]
pub struct RdUserInfo {
pub id: i64,
}
这是Cargo.toml
:
[package]
name = "rust-learn"
version = "0.1.0"
edition = "2018"
[dependencies]
serde = { version = "1.0.64", features = ["derive"] }
serde_json = "1.0.64"
我想知道是否可以尝试将字符串转换为 i64,如果失败,则抛出错误。我已经尝试过这样的:
#[derive(Serialize, Deserialize)]
pub struct RdUserInfo {
#[serde(try_from = "String")]
pub id: i64,
}
不工作。顺便说一句,错误表明:
invalid type: string "1", expected i64 at line 1 column 9
try_from
是根据特质起作用的TryFrom
,但由于主要是历史原因TryFrom<&str>
并且TryFrom<String>
不是真正的事物,FromStr
特质反而存在。遗憾的是,与 serde 不同,
TryFrom
它没有 的钩子FromStr
,因此您的选择是手动实现反序列化或使用serde_with
。或者乘坐时间机器,每当专业化实现时,就会有
TryFrom<&str>
forFromStr
的全面实现。