我在R中有一个字符串,用于转义引号:
my_text = {\"stim\":[\"platery\",\"denial\",\"generic\"]}
使用cat()
时,我得到:
{"stim":["platery","denial","generic"]}
现在我的整个字符串是一个需要解析的JSON字符串,并被JSONLint评估为无效。如果我复制并粘贴cat()
版本,这是一个有效的JSON,所以我想我只是错过了一些预处理。
我看到了这篇帖子here,and this one,and this really good one,所以我尝试用JSON解析器的双引号替换单引号:
gsub("\\\\", "\\\\\\\\", my_text, fixed=TRUE)
但它并没有像我想的那样改变我的字符串。如何将字符串更改为有效的JSON?
答案 0 :(得分:0)
正如Wiktor所说,你的gsub没有用,因为你试图替换反斜杠,但你的字符串中没有任何反斜杠。 R只是使用反斜杠作为存储双引号的方法。你链接的第三个SO帖子很好地解释了R的字符串文字,它解决了这个问题。 R中的反斜杠存储为双反斜杠。
我的第一条建议是使用R包jsonlite
从R对象构造JSON而不是字符串(heres the vignette)。
示例:
myJSON <- jsonlite::toJSON(list(stim=c("platery","denial","generic")))
# {"stim":["platery","denial","generic"]}
其次,(因为第三个SO帖子再次很好地解释)复制/粘贴字符串的print方法可能不是验证JSON的最佳方法。我不确定用例,但是用转义字符存储双引号的R可能不是一件坏事。
如果你想获得一个更漂亮的印刷方法,你可以在R(noquote()
,cat()
,print(quote=F)
)中使用大量技巧,但这不会改变R存储的带反斜杠的双引号:
此外,在某些情况下,构建JSON是不必要的。我有一个使用plumbr
包构建的API,它将列表作为JSON返回而不做任何修改(recJSON <- list(message=messages,recommendations=list(name=names, link=URLs))
)