【问题标题】:R convert dataframe to JSONR将数据框转换为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 只是为了将来检查。

标签: r json dataframe rjson


【解决方案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"}]

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2016-07-27
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多