使用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
相关产品推荐
相关产品推荐

