使用jsonlite或其他方法从R编码JSON表达式

wdk*_*nls 2 json r dataframe jsonlite

我正在使用的API需要我发送一条JSON消息,如:

y <- '[{"a":1, "b":"select", "c":["A", "B", "C"]}, 
       {"a":2, "b":"text"},
       {"a":3, "b":"select", "c":["D", "E", "F", "G"]}]'
Run Code Online (Sandbox Code Playgroud)

请注意,如果"b" : "select"有另一个变量c,其值为数组.

当我尝试运行fromJSON(y)(在jsonlite包中)时,我得到data.frame第3列是列表的位置:

> z <- fromJSON(y) 
> class(z)
[1] "data.frame"
> z %>% glimpse()
Observations: 3
Variables: 3
$ a (int) 1, 2, 3
$ b (chr) "select", "text", "select"
$ c (list) A, B, C, NULL, D, E, F, G
Run Code Online (Sandbox Code Playgroud)

但是当我将其转换回JSON (这是我想发送给API的格式)时,c变量出现在它不应该的位置.

[{"a":1,"b":"select","c":["A","B","C"]},
 {"a":2,"b":"text","c":{}},
 {"a":3,"b":"select","c":["D","E","F","G"]}]
Run Code Online (Sandbox Code Playgroud)

是否有另一个R数据结构可以JSON使用jsonlite(或其他)可靠地将我从数据帧转移到原始消息?它会如何工作?

skw*_*won 5

用jsonlite,你可以这样做:

z <- fromJSON(y, simplifyDataFrame = F)
toJSON(z, auto_unbox=T)
Run Code Online (Sandbox Code Playgroud)

另外,请考虑以下最后一个c元素的情况["D"]:

y2 <- '[{"a":1, "b":"select", "c":["A", "B", "C"]}, 
        {"a":2, "b":"text"}, 
        {"a":3, "b":"select", "c":["D"]}]'

z2 <- fromJSON(y2, simplifyDataFrame = F)
toJSON(z2, auto_unbox=T)
Run Code Online (Sandbox Code Playgroud)

结果如下:

[{"a":1,"b":"select","c":["A","B","C"]},
 {"a":2,"b":"text"},
 {"a":3,"b":"select","c":"D"}]
Run Code Online (Sandbox Code Playgroud)

这可能是一个麻烦,因为最后一个c元素"D"不是["D"].

为了防止这种情况,请不要使用auto_unbox.请unbox仔细使用如下:

z2 <- fromJSON(y2, simplifyDataFrame = F)
for(i in 1:length(z2)){
  z2[[i]][[1]] <- unbox(z2[[i]][[1]])
  z2[[i]][[2]] <- unbox(z2[[i]][[2]])
}
toJSON(z2)
Run Code Online (Sandbox Code Playgroud)