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

使用serde_json解析字符串时遭遇‘trailing characters’错误的解决咨询

解决serde_json::from_str转换特定字符串时的末尾字符错误

这个问题我之前也碰到过,本质是你传入的字符串不符合合法JSON格式导致的~serde_json::from_str要求输入必须是标准JSON结构:要么是带双引号的字符串、要么是合法数字、布尔值、数组或对象。而你传入的"73723235c81ebbec0"既不是十进制数字(JSON不支持十六进制数字,c及后续字符不属于合法数字字符),也不是包裹在双引号里的JSON字符串,所以解析器读到第9位的c时就判定是无效末尾字符,抛出了错误。

根据你的实际需求,有两种常用的解决方式:

方式一:将原字符串作为JSON字符串值解析

如果你只是想把这个字符串原样转换成serde_json::Value的字符串类型,只需要给原字符串加上JSON要求的双引号包裹,让它变成合法的JSON字符串即可:

use serde_json::Value;

fn main() {
    // 手动添加转义双引号,直接构造合法JSON字符串
    let new_str = "\"73723235c81ebbec0\"";
    let json_value: Value = serde_json::from_str(new_str).unwrap();
    println!("{:?}", json_value); // 输出:String("73723235c81ebbec0")

    // 用format!动态生成带引号的字符串,更适合动态场景
    let original_str = "73723235c81ebbec0";
    let json_str = format!("\"{}\"", original_str);
    let json_value2: Value = serde_json::from_str(&json_str).unwrap();
    println!("{:?}", json_value2); // 同样输出String类型的值
}

方式二:将十六进制字符串解析为数字类型的Value

如果你的目标是把这个十六进制字符串转换成JSON的数字值,需要先将其解析为对应的数值类型(比如u64),再转换成serde_json::Value:

use serde_json::{Value, Number};

fn main() {
    let hex_str = "73723235c81ebbec0";
    // 把十六进制字符串转成u64,第二个参数16表示基数为十六进制
    let num = u64::from_str_radix(hex_str, 16).unwrap();
    // 将u64转成serde_json的Number类型,再包装成Value
    let json_value = Value::Number(Number::from(num));
    println!("{:?}", json_value); // 输出:Number(16348976476629680064)
}

注意:如果你的十六进制字符串长度超过u64的范围,可以改用u128或其他大整数类型,只要serde_json::Number支持即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:29:09