我正在尝试将以下JSON文件(“my_file.json”)读入R,其中包含以下内容:
[{"id":"484","comment":"They call me "Bruce""}]
使用jsonlite软件包(0.9.12),以下内容失败:
library(jsonlite)
fromJSON(readLines('~/my_file.json'))
收到错误:
"Error in parseJSON(txt) : lexical error: invalid char in json text.
84","comment":"They call me "Bruce""}]
(right here) ------^"
以下是R转义文件的输出:
readLines('~/my_file.json')
"[{\"id\":\"484\",\"comment\":\"They call me \"Bruce\"\"}]"
删除“Bruce”周围的引号可以解决问题,如:
my_file.json
[{"id":"484","comment":"They call me Bruce"}]
但擒纵机构的问题是什么?
答案 0 :(得分:7)
在R strings literals中可以使用单引号或双引号来定义 例如
s1 <- 'hello'
s2 <- "world"
当然,如果你想在使用双引号定义的字符串文字中包含双引号,你需要转义(使用反斜杠)内部引号,否则R代码解析器将无法检测到字符串的结尾正确(单引号也是如此) 例如
s1 <- "Hello, my name is \"John\""
如果您在控制台上打印(使用cat
¹)此字符串,或者您在文件上写下此字符串,您将获得字符串的实际“面”,而不是R文字表示,即:
> cat("Hello, my name is \"John\"")
Hello, my name is "John"
json解析器,读取字符串的实际“面”,因此,在你的情况下,json读取:
[{"id":"484","comment":"They call me "Bruce""}]
not(R文字表示):
"[{\"id\":\"484\",\"comment\":\"They call me \"Bruce\"\"}]"
话虽如此,当你在字符串中有引号时,json解析器也需要双引号转义。
因此,您的字符串应该以这种方式修改:
[{"id":"484","comment":"They call me \"Bruce\""}]
如果您只是通过添加反斜杠来修改文件,那么您将完全能够阅读json。
请注意,该字符串的相应R文字表示形式为:
"[{\"id\":\"484\",\"comment\":\"They call me \\\"Bruce\\\"\"}]"
事实上,这有效:
> fromJSON("[{\"id\":\"484\",\"comment\":\"They call me \\\"Bruce\\\"\"}]")
id comment
1 484 They call me "Bruce"
¹
默认的R print
函数(当您只是按一下某个值时调用)也会返回相应的R字符串文字。如果您要打印实际字符串,则需要使用print(quote=F,stringToPrint)
或cat
函数。
编辑(关于@EngrStudent评论自动化报价转发的可能性):
Json解析器无法自动转义引号
我的意思是,尝试将自己置于计算机的鞋子和图像中,你应该将这个(未转义的)字符串解析为json:{ "foo1" : " : "foo2" : "foo3" }
我看到至少有三个可能逃脱给出一个有效的json:
{ "foo1" : " : \"foo2\" : \"foo3" }
{ "foo1\" : " : "foo2\" : \"foo3" }
{ "foo1\" : \" : \"foo2" : "foo3" }
从这个小例子中可以看出,逃避确实是必要的,以避免含糊不清。
也许,如果你要转义的字符串有一个非常特殊的结构,你可以识别(没有不确定性)需要转义的双引号,你可以创建自己的自动转义程序,但你需要从头开始,因为没有任何内置的东西。