0

我有一个用 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\"}"
4

1 回答 1

1

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

如果您无法修复这些非 JSON 字符串的来源,我能想到的唯一解决方案涉及大量繁重的工作,但需要注意的是:

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

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

真正的答案:

  • 返回“400 Bad Request”和一些额外的“格式错误的 json”提示
  • 如果您可以访问它,请修复客户端

补充说明:

于 2019-07-12T19:21:46.493 回答