在 R字符串中,文字可以使用单引号或双引号来定义。
例如
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""}]
不是(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"
¹ 默认的 Rprint
函数(当您在一个值上按 ENTER 时也会调用)返回相应的 R 字符串文字。如果要打印实际的字符串,则需要使用print(quote=F,stringToPrint)
, 或cat
函数。
编辑(在@EngrStudent 评论自动化引号转义的可能性):
Json 解析器不能自动转义引号。
我的意思是,试着设身处地为计算机着想,你应该将这个(未转义的)字符串解析为 json:{ "foo1" : " : "foo2" : "foo3" }
我看到至少三种可能的转义给出了一个有效的 json:
{ "foo1" : " : \"foo2\" : \"foo3" }
{ "foo1\" : " : "foo2\" : \"foo3" }
{ "foo1\" : \" : \"foo2" : "foo3" }
从这个小例子可以看出,为了避免歧义,转义确实是必要的。
也许,如果你想转义的字符串有一个非常特殊的结构,你可以识别(没有不确定性)需要转义的双引号,你可以创建自己的自动转义过程,但你需要从头开始,因为有没有内置的。