在反序列化之前对值进行 JSON 转义引号



我有一个用 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 字符串的来源,我能想到的唯一解决方案涉及大量繁重的工作,但需要注意:

  1. 编写自定义"格式错误的 JSON"解析器
  2. 仔细检查/测试/分析损坏的客户端是如何损坏的
  3. 使用破碎信息修复"格式错误的 JSON">
  4. 使用固定的 JSON 进行正常的请求处理

我建议不要这样做,除非是训练练习。修复客户端将在几分钟内完成,但在服务器上完美实现这将需要几天或几周的时间。下次更改此有问题的客户端时,您将不得不重做所有艰苦的工作。

真正的答案:

  • 返回"400 错误请求",并带有一些额外的"格式错误的 json"提示
  • 修复客户端(如果您有权访问它)

附加说明:

  • 避免在服务器中解包
  • 寻找将Result::Err传播给调用方并使用它来触发"400 错误请求"响应
  • 的方法
  • 查看 Rust 书中的错误处理章节了解更多信息

最新更新