【问题标题】:Nested R dataframe to JSON with objects instead of arrays使用对象而不是数组将 R 数据框嵌套到 JSON
【发布时间】:2020-03-24 07:15:38
【问题描述】:

我需要将数据帧转换为 JSON。数据框中有几个嵌套的数据框作为变量来转换为 JSON。

但是,在转换为 JSON 时,我需要将下面描述的 Values1 的数据作为对象(仅包含在 {} 中)而不是数组(包含在 [] 中)。

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

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 的样子:

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

任何想法如何将Values1 从数组转换为对象?它们不能在数组中,因为 API 不接受 [

我已经研究过使用jsonlite 中的unbox() 但这仅适用于单例。我还尝试以各种方式构建我的最终数据框。

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

【问题讨论】:

    标签: r json dataframe nested jsonlite


    【解决方案1】:

    这应该返回你想要的:

    ...
    
    df3 <- left_join(df1, df2, by = "name") 
    
    json <- mutate(df3, Values1 = purrr::map(Values1, as.list)) %>% 
      jsonlite::toJSON(auto_unbox = TRUE, pretty = TRUE)
    

    你能确认一下吗?

    【讨论】:

    • 是的!是的!谢谢 :) 我已经对我的实际数据进行了测试,这比 reprex 涉及更多,它就像一个魅力。我知道我必须以某种方式将嵌套的 dfs 转换为列表并使用 unbox 功能,但就是想不通。感谢您快速、简洁的回复。
    • 是的,酷!我发现解决方案有点hacky,但无法找到更清洁的方法。 (顺便说一句,我从这个关于 tidyr v1.0.0 嵌套结构和 jsonlite 的半相关临时修复中获得了灵感:github.com/jeroen/jsonlite/issues/292#issue-494791462
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 2014-04-26
    • 1970-01-01
    • 2021-02-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多