serde_json::from_str能否解析字符串无双引号的JSON数据?
核心结论
serde_json::from_str() 是严格的标准JSON解析实现,不支持直接解析字符串值未用双引号包裹的非标准JSON,你测试时碰到的解析报错属于预期行为。
按照JSON官方规范要求,所有字符串类型的值(包括对象的键名)必须使用双引号包裹,未加双引号的内容会被判定为非法输入,就会触发你看到的expected value错误。
处理方案
要解析这类不符合标准的JSON内容,可选两种落地方式:
- 换用支持宽松JSON解析的库
Rust生态里有专门适配非标准JSON的解析库,默认兼容无引号字符串、单引号、尾逗号等常见的非标准写法,直接替换serde_json的解析逻辑即可,不需要自己做格式修正。 - 解析前做文本预处理
如果不想引入额外依赖,可以在调用解析方法前,通过正则匹配或者逐字符遍历的方式,给未被双引号包裹的字符串值补上双引号,把内容修正为符合标准的JSON格式后,再传给serde_json::from_str()解析。预处理时要注意做好边界判断,不要误给数字、布尔值、null、数组、对象这些本身不需要双引号的合法值加引号。
问题复现说明
你给出的测试代码中,url字段对应的值https://www.google.com没有被双引号包裹,解析器读到https起始位置时,识别不出这是合法的JSON值类型(标准JSON合法值仅包括:双引号包裹的字符串、数字、true/false、null、数组、对象),所以在第2行第19列也就是https开头的位置抛出错误。
只要把值补上双引号改成标准格式,就能正常解析运行:
let raw_text = r##"{ "url" : "https://www.google.com" }"##;
内容的提问来源于stack exchange,提问作者Debasish Patra
相关产品推荐
相关产品推荐

