一位同事给了我一个分隔文件。一列包含类似JSON的键/值对。我想把它们解析成列表。不幸的是,同事' JSON表示法似乎与 rjson 的期望相匹配。
jsonString <- "{person:[Santa],location:[NorthPole]}"
fromJSON(jsonString)
Error in fromJSON(jsonString) :
unexpected character "p"; expecting opening string quote (") for key value
所以我决定做一些正则表达式清理,将方括号转换成引号。我可以替换&#39; [&#39;与&#39;&#34;&#39;,但我在更换&#39; [&#39;和&#39;]&#39;在同一个操作中:
gsub(pattern = "\\[", replacement = '"', x = jsonString)
[1] "{person:\"Santa],location:\"NorthPole]}"
角色类是可能的:
gsub(pattern = "[aeiou]", replacement = '"', x = jsonString)
[1] "{p\"rs\"n:[S\"nt\"],l\"c\"t\"\"n:[N\"rthP\"l\"]}"
但是在这种情况下,没有检测到括号:
gsub(pattern = "[\\[\\]]", replacement = '"', x = jsonString)
[1] "{person:[Santa],location:[NorthPole]}"
我也可以使用其他非正则表达式解决方案将类似JSON的字符串解析为R数据对象。
答案 0 :(得分:2)
我不知道这是否足够通用但它适用于你的简单案例:
> require(RJSONIO)
Loading required package: RJSONIO
> qjson <- gsub(patt="(\\w+)", repl='"\\1"', gsub("[][]", "", jsonString) )
> fromJSON(qjson)
person location
"Santa" "NorthPole"
取出所有&#34; [&#34;和&#34;]&#34;并在所有&#34;单词&#34;周围加上双引号。 &#34; [&#34;和&#34;]&#34;字符是字符串敏感的位置。要匹配文字 - &#34;]&#34;它需要是第一个并且与文字匹配 - &#34; [&#34;它需要在任何地方,但首先。请参阅有关字符类的?regex
部分。
答案 1 :(得分:1)
我无法准确说明原因,但设置perl=TRUE
似乎解决了
gsub(pattern = "[\\[\\]]", replacement = '"', x = jsonString, perl=TRUE)
# [1] "{person:\"Santa\",location:\"NorthPole\"}"
必须与基本解释器解析字符类的方式不同。
您还可以尝试使用正则表达式直接提取数据。在这里,我使用regcapturedmatches辅助函数。
m<-gregexpr("(\\w+):\\[([^]]*)\\]", jsonString, perl=T)
regcapturedmatches(jsonString , m)
# [[1]]
# [,1] [,2]
# [1,] "person" "Santa"
# [2,] "location" "NorthPole"