反序列化之前,JSON转义引用值

时间:2019-07-12 14:51:31

标签: json rust serde-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();

但是会导致以下错误: 线程”在Result::unwrap()值上被称为Err的情况下惊慌失措:错误(“键必须是字符串”,第1行,第2列)

我怀疑是因为它将字符串转换为以下内容:

let data = "{\"name\":\"\"test\"\", \"username\":\"tomdrc1\", \"date_created\":\"07/12/2019\", \"category\":\"Developer\", \"content\":\"awdawdasdwd\"}"

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,那么问题是您收到的字符串应该是JSON,但实际上格式错误(可能是通过串联字符串生成的)。

如果您无法修复那些非JSON字符串的来源,那么我想到的唯一解决方案涉及很多警告:

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

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

真正的答案:

  • 返回“ 400错误请求”以及一些其他“格式错误的json”提示
  • 如果可以访问,请修复客户端

其他说明:

  • 避免在服务器中使用unwrapping
  • 寻找将Result::Err传播给呼叫者并使用它触发“ 400错误请求”响应的方法
  • 在Rust书中查看error handling chapter,了解更多信息
相关问题