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&lt;-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&lt;-lapply ( (unname( split( (res1 %&gt;% select_at (vars(starts_with("y")))), 1:nrow(res1)) ) ), function(x) rjson::toJSON(x) ) res1 %&gt;% select_at (vars(-starts_with("y")))【参考方案3】:

现在您可以轻松地直接在数据帧上调用jsonlite::write_json()

【讨论】:

read_jsonwrite_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的主要内容,如果未能解决你的问题,请参考以下文章

Json读取并转换为数据框

将带有坐标的json文件嵌套到R中的数据框中

将 json 转换为 Pandas 数据框

将嵌套 JSON 转换为数据框

如何将 json 转换为 pandas 数据框?

将导入的 json 数据导入数据框