You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust Serde JSON反序列化时如何将字符串转为i64?

解决serde_json将字符串反序列化为i64的问题

问题背景

前端JavaScript无法处理i64类型,服务器因此将i64字段转为字符串返回,导致Rust端使用serde_json反序列化时失败,报错信息如下:

invalid type: string "1", expected i64 at line 1 column 9

尝试使用#[serde(try_from = "String")]属性未生效,原因是标准库中i64并未实现TryFrom<String> trait,serde无法自动完成该转换。

解决方案

方案1:自定义反序列化函数

通过#[serde(deserialize_with)]指定自定义函数,手动完成字符串到i64的转换:

use serde::{Serialize, Deserialize, Deserializer};
use std::str::FromStr;

// 自定义反序列化函数:将字符串转为i64
fn deserialize_string_to_i64<'de, D>(deserializer: D) -> Result<i64, D::Error>
where
    D: Deserializer<'de>,
{
    let s = String::deserialize(deserializer)?;
    i64::from_str(&s).map_err(serde::de::Error::custom)
}

#[derive(Serialize, Deserialize)]
pub struct RdUserInfo {
    #[serde(deserialize_with = "deserialize_string_to_i64")]
    pub id: i64,
}

#[tokio::main]
async fn main() {
    let text_response = r#"{"id":"1"}"#;
    match serde_json::from_str::<RdUserInfo>(text_response) {
        Ok(user) => println!("Deserialized user: {:?}", user),
        Err(e) => println!("Error: {}", e),
    }
}

方案2:使用serde_with库(更简洁)

serde_with库封装了常见的序列化/反序列化转换逻辑,只需添加依赖并使用属性即可:

  1. 更新Cargo.toml添加依赖:
[dependencies]
serde = { version = "1.0.64", features = ["derive"] }
serde_json = "1.0.64"
serde_with = "3.0"
  1. 修改结构体代码:
use serde::{Serialize, Deserialize};
use serde_with::serde_as;

#[serde_as]
#[derive(Serialize, Deserialize)]
pub struct RdUserInfo {
    #[serde_as(as = "FromStr")]
    pub id: i64,
}

#[tokio::main]
async fn main() {
    let text_response = r#"{"id":"1"}"#;
    match serde_json::from_str::<RdUserInfo>(text_response) {
        Ok(user) => println!("Deserialized user: {:?}", user),
        Err(e) => println!("Error: {}", e),
    }
}

验证效果

  • 当JSON中id为合法数字字符串(如"1")时,可成功反序列化为i64类型;
  • 当id为非数字字符串(如"abc")时,会抛出转换错误,符合需求。

内容的提问来源于stack exchange,提问作者Dolphin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:30:15