我有一个用 Rust 编写的服务器,这个服务器以 JSON 格式接收请求,服务器获取的 JSON 是一个字符串,有时用户会在值内写引号。例如,在创建新的论坛主题时。
我唯一真正需要做的就是转义值内的引号。
所以这个:
"{"name":""test"", "username":"tomdrc1", "date_created":"07/12/2019", "category":"Developer", "content":"awdawdasdwd"}"
需要变成这样:
"{"name":""test"", "username":"tomdrc1", "date_created":"07/12/2019", "category":"Developer", "content":"awdawdasdwd"}"
我试图替换:
let data = let data = "{"name":""test"", "username":"tomdrc1", "date_created":"07/12/2019", "category":"Developer", "content":"awdawdasdwd"}".to_string().replace(""", "\"");
let res: serde_json::Value = serde_json::from_str(&data).unwrap();
但它会导致以下错误: 线程 '' 在Err
值上Result::unwrap()
调用时惊慌失措:错误("键必须是字符串",行:1,列:2)
我怀疑是因为它将字符串转换为以下内容:
let data = "{"name":""test"", "username":"tomdrc1", "date_created":"07/12/2019", "category":"Developer", "content":"awdawdasdwd"}"
如果我理解正确,问题是您收到的字符串应该是 JSON,但实际上格式不正确(可能是由连接字符串生成的)。
如果您无法修复这些非 JSON 字符串的来源,我能想到的唯一解决方案涉及大量繁重的工作,但需要注意:
- 编写自定义"格式错误的 JSON"解析器
- 仔细检查/测试/分析损坏的客户端是如何损坏的
- 使用破碎信息修复"格式错误的 JSON">
- 使用固定的 JSON 进行正常的请求处理
我建议不要这样做,除非是训练练习。修复客户端将在几分钟内完成,但在服务器上完美实现这将需要几天或几周的时间。下次更改此有问题的客户端时,您将不得不重做所有艰苦的工作。
真正的答案:
- 返回"400 错误请求",并带有一些额外的"格式错误的 json"提示
- 修复客户端(如果您有权访问它)
附加说明:
- 避免在服务器中解包
- 寻找将
Result::Err
传播给调用方并使用它来触发"400 错误请求"响应
的方法 - 查看 Rust 书中的错误处理章节了解更多信息