使用对象而不是数组将R数据框嵌套到JSON

时间:2019-11-28 15:30:04

标签: r json dataframe nested jsonlite

我需要将数据框转换为JSON。在数据框中有多个嵌套数据框作为变量,可以转换为JSON。

但是,当转换为JSON时,我需要下面描述的http://foo-bar-svc的数据是一个对象(仅包含在Values1中)而不是一个数组(包含在{}中)。

下面的代码代表了我当前的工作流程和问题。

[]

这是上面的json的样子:

library(dplyr)
library(tidyr)
library(jsonlite)

df1 <- data.frame(name = c("a", "b", "c"),
                 v = c(1, 2, 3),
                 w = c(10, 20, 30)) %>%
  group_by(name) %>%
  nest_legacy(.key = "Values1")

df2 <- data.frame(name = c("a", "b", "c"),
                  x = c(5, 10, 15),
                  y = c(100, 200, 300),
                  z = c(1000, 2000, 3000)) %>%
  group_by(name) %>%
  nest_legacy(.key = "Values2")

df3 <- df1 %>%
  left_join(df2)

json <- toJSON(df3, dataframe = "rows", pretty = TRUE)

json

但是,这就是我需要的样子:

> json
[
  {
    "name": "a",
    "Values1": [
      {
        "v": 1,
        "w": 10
      }
    ],
    "Values2": [
      {
        "x": 5,
        "y": 100,
        "z": 1000
      }
    ]
  },
  {
    "name": "b",
    "Values1": [
      {
        "v": 2,
        "w": 20
      }
    ],
    "Values2": [
      {
        "x": 10,
        "y": 200,
        "z": 2000
      }
    ]
  },
  {
    "name": "c",
    "Values1": [
      {
        "v": 3,
        "w": 30
      }
    ],
    "Values2": [
      {
        "x": 15,
        "y": 300,
        "z": 3000
      }
    ]
  }
] 

有什么想法如何将> json [ { "name": "a", "Values1": { "v": 1, "w": 10 }, "Values2": [ { "x": 5, "y": 100, "z": 1000 } ] }, { "name": "b", "Values1": { "v": 2, "w": 20 }, "Values2": [ { "x": 10, "y": 200, "z": 2000 } ] }, { "name": "c", "Values1": { "v": 3, "w": 30 }, "Values2": [ { "x": 15, "y": 300, "z": 3000 } ] } ] 从数组转换为对象?它们不能位于数组中,因为API不接受Values1

我看过使用[中的unbox(),但这仅适用于单例。我还尝试了各种方式构造最终数据框。

任何提示/想法都非常感谢!

1 个答案:

答案 0 :(得分:2)

这应该返回您想要的内容:

...

df3 <- left_join(df1, df2, by = "name") 

json <- mutate(df3, Values1 = purrr::map(Values1, as.list)) %>% 
  jsonlite::toJSON(auto_unbox = TRUE, pretty = TRUE)

您可以确认吗?