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

使用单元素数组将数据帧转换为JSON,json,r,jsonlite,Json,R,Jsonlite,假设我有以下数据: df <- data.frame(value = c("foo", "bar", "baz")) 但是如果我需要作为单元素数组的值,我如何构造原始数据?我尝试了一些变体,包括c()、list()和I()。无法获得此输出: [{"value":["foo"]},{"value":["bar"]},{"value":["baz"]}] 您可以将列表传递给toJSON函数 library(jsonlite) df <- data.frame(value = c("f

假设我有以下数据:

df <- data.frame(value = c("foo", "bar", "baz"))
但是如果我需要作为单元素数组的值,我如何构造原始数据?我尝试了一些变体,包括
c()
list()
I()
。无法获得此输出:

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

您可以将列表传递给
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
函数

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

为了得到你想要的安排,你需要一个列表

jsonlite::toJSON(list(list("value"="foo"), list("value"="bar"), list("value"="baz")))
# [{"value":["foo"]},{"value":["bar"]},{"value":["baz"]}] 
我们可以在tidyverse函数
mutate\u all
的帮助下完成这项工作,将所有列转换为列表

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

为了得到你想要的安排,你需要一个列表

jsonlite::toJSON(list(list("value"="foo"), list("value"="bar"), list("value"="baz")))
# [{"value":["foo"]},{"value":["bar"]},{"value":["baz"]}] 
我们可以在tidyverse函数
mutate\u all
的帮助下完成这项工作,将所有列转换为列表

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

唯一需要注意的是,
apply
将data.frame转换为矩阵,因此如果有不同数据类型的列,这可能会变得混乱。但是对于问题中只有一列的简单例子来说,这是非常好的。是的,这个问题包括了一个非常精简的测试用例,但是这看起来很有希望。似乎奇怪的是,
toJSON
无法按数据的显示方式处理数据。唯一需要注意的是,
apply
将data.frame转换为矩阵,因此如果您有不同数据类型的列,这可能会变得混乱。但是对于问题中只有一列的简单例子来说,这是非常好的。是的,这个问题包括了一个非常精简的测试用例,但是这看起来很有希望。似乎奇怪的是,
toJSON
没有办法按显示的方式处理数据。在您的回答中可能值得一提的是,要仅更改
value
列,请使用
mutate_at
而不是
mutate_all
df%>%mutate_at(vars(value),as.list)%%>%jsonlite::toJSON()
。列表列表是更具吸引力的解决方案,但它似乎有相反的问题;它将每个值转换为一个数组。(问题中的数据只是一个精简的测试用例,我有两列。)我可以通过使用
I()
并将
auto_unbox
设置为true来解决这个问题。您可以控制哪些值不会被
unbox
包装到数组中。用一个更现实的例子来帮助你总是比较容易的。在你的回答中可能值得一提的是,要只更改
列,请使用
mutate_at
而不是
mutate_all
df%>%mutate_at(vars(value),as.list)%%>%jsonlite::toJSON()
。列表列表是更具吸引力的解决方案,但它似乎有相反的问题;它将每个值转换为一个数组。(问题中的数据只是一个精简的测试用例,我有两列。)我可以通过使用
I()
并将
auto_unbox
设置为true来解决这个问题。您可以控制哪些值不会被
unbox
包装到数组中。用一个更现实的例子来帮助别人总是比较容易的。