我有一个用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\"}"
答案 0 :(得分:1)
如果我正确理解您的问题,那么问题是您收到的字符串应该是JSON,但实际上格式错误(可能是通过串联字符串生成的)。
如果您无法修复那些非JSON字符串的来源,那么我想到的唯一解决方案涉及很多警告:
我建议不要这样做,除非是训练运动。修复客户端将在几分钟内完成,但是在服务器上完美实现此过程将需要数天或数周。下次更换这个有问题的客户时,您将不得不重做所有的辛苦工作。
真正的答案:
其他说明:
Result::Err
传播给呼叫者并使用它触发“ 400错误请求”响应的方法