R将数据框转换为JSON
Posted
技术标签:
【中文标题】R将数据框转换为JSON【英文标题】:R convert dataframe to JSON 【发布时间】:2014-10-22 10:17:14 【问题描述】:我有一个要转换为 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"]
【问题讨论】:
你认为你为什么想要这种格式? jsonlint.com 表示无效。 @doctorlove,我已经更新了我需要查看的 json 格式。谢谢。 仍然无效 ;-)Parse error on line 20: ... 5, "value:"server5"] ----------------------^ Expecting '', ':', ',', ']'
@doctorlove,我错过了“,已更新。
更好 :-) 请考虑使用jsonlint.com 只是为了将来检查。
【参考方案1】:
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"]
【讨论】:
如果您有问题,您的值嵌套在一个数组中,而不是单个值:使用 toJSON 函数中的选项 auto_unbox=TRUE 将 "value":["server1" ] 到“值”:“server1”。示例命令:toJSON(res1, pretty=TRUE, flatten=TRUE, auto_unbox=TRUE)【参考方案2】:怎么样
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()
,我们实质上是将大data.frame 分解为每一行的单独data.frame。通过从结果列表中删除名称,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")))
【参考方案3】:
现在您可以轻松地直接在数据帧上调用jsonlite::write_json()
。
【讨论】:
read_json
和 write_json
旨在从磁盘读取/写入。 jsonlite::toJSON(res1)
仍然是这个问题的正确答案。【参考方案4】:
你也可以使用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"]
【讨论】:
以上是关于R将数据框转换为JSON的主要内容,如果未能解决你的问题,请参考以下文章