将数据框转换为JSON

46
我有一个数据框,想将其转换为JSON格式:
我的数据框叫做res1:
library(rjson)

structure(list(id = c(1, 2, 3, 4, 5), value = structure(1:5, .Label = c("server1", 
"server2", "server3", "server4", "server5"), class = "factor")), .Names = c("id", 
"value"), row.names = c(NA, -5L), class = "data.frame")

当我执行:

toJSON(res1)

我得到了这个:

{"id":[1,2,3,4,5],"value":["server1","server2","server3","server4","server5"]}

我需要这个JSON输出就像这样,有什么想法吗?

[{"id":1,"value":"server1"},{"id":2,"value":"server2"},{"id":3,"value":"server3"},{"id":4,"value":"server4"},{"id":5,"value":"server5"}]

你为什么认为你想要以那种格式呈现它?http://jsonlint.com/显示它不是有效的。 - doctorlove
@doctorlove,我已经更新了我需要查看的JSON格式。谢谢。 - user1471980
仍然无效;-) 第20行解析错误: ... 5, "value:"server5"}] ----------------------^ 期望 '}', ':', ',', ']' - doctorlove
@doctorlove,我错过了“,已更新。 - user1471980
1
更好的方式是考虑在将来使用 http://jsonlint.com/ 进行检查。 - doctorlove
4个回答

63

这个jsonlite软件包的存在正是为了解决这个问题:“JSON数据和R对象之间的实用且一致的映射。”

它的toJSON函数提供了默认选项下所需的结果:

library(jsonlite)
x <- toJSON(res1)
cat(x)

## [{"id":1,"value":"server1"},{"id":2,"value":"server2"},
## {"id":3,"value":"server3"},{"id":4,"value":"server4"},
## {"id":5,"value":"server5"}]

1
如果您的值嵌套在数组中而不是单个值,请在toJSON函数中使用选项auto_unbox=TRUE来取消嵌套"value":["server1"]"到"value":"server1"。示例命令:toJSON(res1, pretty=TRUE, flatten=TRUE, auto_unbox=TRUE) - klickagent.ch

35

怎么样?

library(rjson)
x <- toJSON(unname(split(res1, 1:nrow(res1))))
cat(x)
# [{"id":1,"value":"server1"},{"id":2,"value":"server2"},
# {"id":3,"value":"server3"},{"id":4,"value":"server4"},
# {"id":5,"value":"server5"}]

通过使用split()函数,我们实质上将大型数据框拆分为每行一个单独的数据框。然后通过从结果列表中删除名称,toJSON函数将结果封装在数组而不是命名对象中。


谢谢。如果我们想按行拆分,可以使用以下代码:library(rjson);library(dplyr);res1<-data.frame(id= c(1, 2, 3, 4, 5),server=c("server1", "server2", "server3", "server4", "server5"),y1=letters[1:5],y2=LETTERS[1:5]),然后使用 res1$JsonList<-lapply ( (unname( split( (res1 %>% select_at (vars(starts_with("y")))), 1:nrow(res1)) ) ), function(x) rjson::toJSON(x) ) 进行拆分,最后使用 res1 %>% select_at (vars(-starts_with("y"))) 进行选择。 - phili_b

6
现在,您可以直接在数据框上调用jsonlite::write_json()来轻松地进行操作。

6
read_jsonwrite_json 是用来读写磁盘上的文件的。对于这个问题,jsonlite::toJSON(res1) 仍然是正确的答案。 - SymbolixAU

1
您也可以使用library(jsonify)
jsonify::to_json( res1 )
# [{"id":1.0,"value":"server1"},{"id":2.0,"value":"server2"},{"id":3.0,"value":"server3"},{"id":4.0,"value":"server4"},{"id":5.0,"value":"server5"}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接