【问题标题】:JSON escape quotes on value before deserializing反序列化之前值的 JSON 转义引号
【发布时间】:2019-07-12 14:51:31
【问题描述】:

我有一个用 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 rust serde-json


    【解决方案1】:

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

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

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

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

    真正的答案:

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

    补充说明:

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

    【讨论】:

    • 谢谢!我只需要修复客户端,我只是担心有人会弄乱 JS 或类似的东西。我将停止使用 unwrap。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多