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

使用serde_json解析数据时为何总是出现‘trailing characters’错误?

解决Serde JSON解析时的"trailing characters"错误(Postman请求场景)

你碰到的这个问题我之前也踩过坑——核心原因就是从客户端读取的JSON字符串后面跟着缓冲区残留的空字符(\0),这些看不见的字符让Serde误以为JSON内容还没结束,所以抛出了"trailing characters"的错误。

为什么Postman会触发这个问题,直接写字符串却不会?

你直接定义的字符串是完全干净的,没有多余字符;但从缓冲区读取数据时,因为缓冲区是固定大小的,当Postman发送的JSON长度小于缓冲区容量时,缓冲区里没被覆盖的位置会保留初始的空字符,这些字符被一起当成了JSON内容的一部分,自然就解析失败了。

解决方案

这里有两个靠谱的解决办法,按需选择:

1. 快速修复:修剪字符串末尾的空字符

在调用serde_json::from_str之前,先把JSON字符串末尾的空字符去掉就行,用trim_end_matches('\0')方法可以精准移除所有末尾的空字符:

let type_of_request = parsed_request[1];
let content_of_msg: Vec<&str> = msg_from_client.split("\r\n\r\n").collect();
// 修剪掉末尾的空字符,得到干净的JSON字符串
let clean_json = content_of_msg[1].trim_end_matches('\0');
println!("{}", clean_json);
let res: serde_json::Value = serde_json::from_str(clean_json).unwrap();
println!("The username is: {}", res["username"]);

2. 根源解决:只读取实际收到的字节数

如果你的服务器是用固定大小的缓冲区读取数据(比如[0; 1024]这种数组),那最好只把实际读取到的字节转换成字符串,而不是整个缓冲区:

use std::io::{Read, TcpStream};

// 假设这是你读取客户端数据的代码
let mut buffer = [0; 1024];
let bytes_read = stream.read(&mut buffer).unwrap();
// 只取实际读取到的部分转成字符串,避免包含缓冲区的空字符
let msg_from_client = String::from_utf8_lossy(&buffer[0..bytes_read]);

// 后续的拆分、解析逻辑保持不变
let content_of_msg: Vec<&str> = msg_from_client.split("\r\n\r\n").collect();
let res: serde_json::Value = serde_json::from_str(content_of_msg[1]).unwrap();
println!("The username is: {}", res["username"]);

验证

修改完代码后再用Postman发送请求,应该就能正常解析JSON,不会再出现panic了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:32:08