使用单元素数组将数据框转换为 JSON

Convert data frame to JSON with single-element arrays

提问人:miken32 提问时间:2/6/2018 更新时间:2/6/2018 访问量:1420

问:

假设我有这个数据:

df <- data.frame(value = c("foo", "bar", "baz"))

一个简单的方法让我明白了:toJSON

[{"value":"foo"},{"value":"bar"},{"value":"baz"}]

但是,如果我需要将值作为单元素数组,我该如何构建原始数据?我尝试了一些涉及 、 和 的变体。没有什么能让我得到这个输出:c()list()I()

[{"value":["foo"]},{"value":["bar"]},{"value":["baz"]}]
json r jsonlite

评论


答:

4赞 pogibas 2/6/2018 #1

您可以将列表传递给函数。toJSON

library(jsonlite)
df <- data.frame(value = c("foo", "bar", "baz"))
# Iterate over rows and put them to list
# Output passed to toJSON output
toJSON(apply(df, 1, as.list))
# [{"value":["foo"]},{"value":["bar"]},{"value":["baz"]}] 

像这样输入是:toJSON

apply(df, 1, as.list)

[[1]]
[[1]]$value
[1] "foo"

[[2]]
[[2]]$value
[1] "bar"

[[3]]
[[3]]$value
[1] "baz"

评论

1赞 MrFlick 2/6/2018
唯一需要注意的是,将 data.frame 转换为矩阵,因此如果您有不同数据类型的列,这可能会变得混乱。但是对于只有一列的问题中的简单情况,这非常好。apply
0赞 miken32 2/6/2018
是的,这个问题包括一个非常精简的测试用例,但这看起来很有希望。似乎很奇怪,没有办法按原样处理数据。toJSON
5赞 MrFlick 2/6/2018 #2

要获得所需的排列方式,您需要一个列表列表

jsonlite::toJSON(list(list("value"="foo"), list("value"="bar"), list("value"="baz")))
# [{"value":["foo"]},{"value":["bar"]},{"value":["baz"]}] 

我们可以在 tidyverse 函数的帮助下做到这一点,将所有列转换为列表。mutate_all

library(tidyverse)
df %>% mutate_all(as.list) %>% jsonlite::toJSON()
# [{"value":["foo"]},{"value":["bar"]},{"value":["baz"]}] 

评论

1赞 miken32 2/6/2018
在您的回答中可能值得一提的是,要仅更改列,请使用 : 而不是 : 。valuemutate_atmutate_alldf %>% mutate_at(vars(value), as.list) %>% jsonlite::toJSON()
1赞 miken32 2/6/2018
列表列表是更具吸引力的解决方案,但它似乎有相反的问题;它将每个值转换为数组。(问题中的数据只是一个精简的测试用例,我确实有几列。我能够通过一些使用和设置为 true 来解决这个问题。I()auto_unbox
0赞 MrFlick 2/6/2018
您可以使用 控制哪些值不被包装在数组中。用一个更现实的例子来帮助总是更容易。unbox