R使用jsonlite等库解析JSON字符串报lexical error错误求助
问题根因
报错的核心原因是R字符串字面量的转义规则和JSON的转义规则叠加,导致引号未正确转义。
你在R中定义ex时写的\"会先被R的语法解析器转义为普通双引号,最终传入JSON解析器的实际内容为:
{"promptImageScale":"","standardSetLvl":"unknown","prompt":"A) Thank you" Sam. [prgrph] B) Thank you> Sam. [prgrph] C) Thank you, Sam."}
可以看到prompt字段的值在Thank you后就被提前闭合,后续的 Sam.属于非法JSON语法,因此所有JSON解析库都会报错。你之前验证JSON合法,应该是验证的原始JSON内容,而非R转义处理后的实际解析内容。
你补充的测试场景可以正常运行,是因为你直接给R对象的prompt字段赋值时,单引号包裹的字符串中的双引号不需要额外转义,toJSON序列化时会自动给内容里的双引号加上转义符,生成的JSON本身是合法的,因此可以正常解析。
批量解决方案
- 如果是从文件、接口读取原始JSON,直接用
readLines、httr::content等函数读取原始内容即可,R不会额外处理转义,可直接正常解析。 - 如果确实需要处理已经生成的、存在转义缺失的R字符串,可以用正则替换补全转义,示例代码如下:
library(stringr) fix_invalid_json <- function(json_str) { # 匹配值内部未转义的双引号:排除已转义的引号、排除JSON语法边界的引号 str_replace_all(json_str, '(?<!\\\\)"(?![,:}])', '\\\\\\"') } # 测试修复你的示例 ex <- "{\"promptImageScale\":\"\",\"standardSetLvl\":\"unknown\",\"prompt\":\"A) Thank you\" Sam. [prgrph] B) Thank you> Sam. [prgrph] C) Thank you, Sam.\"}" fixed_ex <- fix_invalid_json(ex) jsonlite::fromJSON(fixed_ex) #> $promptImageScale #> [1] "" #> #> $standardSetLvl #> [1] "unknown" #> #> $prompt #> [1] "A) Thank you\" Sam. [prgrph] B) Thank you> Sam. [prgrph] C) Thank you, Sam."
内容的提问来源于stack exchange,提问作者Daniel Anderson
相关产品推荐
相关产品推荐

