2014-08-28 120 views
14

我有,我想转换成JSON格式的数据帧:转换数据帧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"]} 

我n eed这json的输出是这样的,有什么想法?

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

你为什么想要这种格式? http://jsonlint.com/说这是无效的。 – doctorlove 2014-08-28 14:03:44

+0

@doctorlove,我更新了我需要看到的json格式。谢谢。 – user1471980 2014-08-28 14:14:53

+0

仍然无效;-)'第20行解析错误: ... 5,“value:”server5“}] --------------------- -^ 期待'}',':',',',']' – doctorlove 2014-08-28 14:15:46

回答

17

如何

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函数将结果包装在数组中,而不是命名对象。

36

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"}] 
0

现在你可以很容易地只是调用jsonlite::write_json()直接对数据帧。