将R字符串中的单个反斜杠更改为有效的JSON字符串

时间:2016-08-01 10:56:31

标签: json regex r

我在R中有一个字符串,用于转义引号:

my_text = {\"stim\":[\"platery\",\"denial\",\"generic\"]}

使用cat()时,我得到:

{"stim":["platery","denial","generic"]}

现在我的整个字符串是一个需要解析的JSON字符串,并被JSONLint评估为无效。如果我复制并粘贴cat()版本,这是一个有效的JSON,所以我想我只是错过了一些预处理。

我看到了这篇帖子hereand this oneand this really good one,所以我尝试用JSON解析器的双引号替换单引号:

gsub("\\\\", "\\\\\\\\", my_text, fixed=TRUE)

但它并没有像我想的那样改变我的字符串。如何将字符串更改为有效的JSON?

1 个答案:

答案 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))