R:嵌套 data.table 到 JSON

Posted

技术标签:

【中文标题】R:嵌套 data.table 到 JSON【英文标题】:R: Nested data.table to JSON 【发布时间】:2021-12-29 03:59:23 【问题描述】:

我想从这样的data.table中获取

temp <- data.table(data = list(data.table(a = 1:2,b=1:2)), type = "A")

data type
<data.table[2x2]> A

像这样的 JSON


    "group": 
      
        "data": [
          
            "a": 1,
            "b": 1
          ,
          
            "a": 2,
            "b": 2
          
        ],
        "type": "A"
      
  

问题是我总是以一个额外的数组“[”结束组。 我试过的是 tidyr::nest 和

temp2 <- temp[, list(group=list(.SD))]
jsonlite::toJSON(temp2,pretty = TRUE, auto_unbox = TRUE)

temp3 <- temp[, (list(group=list(as.list(.SD))))]
jsonlite::toJSON(temp3,pretty = TRUE, auto_unbox = TRUE)

我的问题是否有“简单”的解决方案? 谢谢

编辑更复杂的例子

temp <-
  data.table(
    id1 = 1:6,
    id2 = c(rep("A", 2), rep("B", 2), rep("C", 2)),
    data = rep(list(data.table(
      a = 1:2, b = 1:2
    )), 6),
    type = "test"
  )

nest1 <-  temp[, list(list(.SD)),by=.(id1,id2)] %>% setnames("V1","group")
nest1[, type:="B"]
nest2 <-  nest1[, list(list(.SD)),by=.(id2)] %>% setnames("V1","data")
nest2[, type:="C"]
nest3 <- nest2[, list(list(.SD)),by=.(id2)] %>% setnames("V1","group")

jsonlite::toJSON(nest3, pretty = TRUE)

期望的输出(缩短): 组应该只包含对象,不包含数组

[
  
    "id2": "A",
    "group": 
        "data": [
          
            "id1": 1,
            "group": 
                "data": [
                  
                    "a": 1,
                    "b": 1
                  ,
                  
                    "a": 2,
                    "b": 2
                  
                ],
                "type": "test"
              ,
            "type": "B"
          ,
          
            "id1": 2,
            "group": 
                "data": [
                  
                    "a": 1,
                    "b": 1
                  ,
                  
                    "a": 2,
                    "b": 2
                  
                ],
                "type": "test"
              ,
            "type": "B"
          
        ],
        "type": "C"
      
  ,
  
    "id2": "B",
    "group": 
        "data": [],
        "type": "C"
      
  
]

【问题讨论】:

jsonlite::toJSON(list("group" = temp), pretty = TRUE, auto_unbox = TRUE) 好主意谢谢,但结果还是和上面一样。我最终得到了额外的数组。此外,该示例只是完整嵌套结构的一小部分。 知道了。出于某种原因,我们需要手动拆箱 data.frame。在这方面,IMO 的文档有点模棱两可:auto_unbox 只提到了原子向量,而unbox() 也将 1 行的数据帧拆箱,因此它并没有自动应用 unbox()。无论如何:jsonlite::toJSON(list(group = jsonlite::unbox(temp)), pretty = TRUE, auto_unbox = TRUE) 应该这样做 非常感谢。您的解决方案适用于我的示例。不幸的是,我无法将它用于我的真正问题。 1)data.table由几行temp &lt;- data.table(data = list(data.table(a = 1:2,b=1:2),data.table(a=2:3,b=3:4)), type = c("A","B"))组成,并进一步嵌套。我有几个不同级别的组对象。我是否必须从每个对象制作单个 JSON 文件并将它们组合起来? 我在第一篇文章中编辑了一个更复杂的示例 【参考方案1】:

我们可以使用jq 将拆箱作为后处理步骤,因为jsonlite 似乎不允许这种特定用例:

jsonlite::toJSON(nest3, pretty = TRUE) %>% 
  jqr::jq('walk(if type=="array" and length==1 then .[0] else . end)')

jq 位取自 jq ~ is there a better way to collapse single object arrays?

【讨论】:

非常感谢。不知道这个包。对于我的具体例子来说,它就像一个魅力。最后一个问题。如何使其特定于“组”元素。在这种情况下,如果“数据”只有一个对象,它也会被简化为一个对象,但它需要作为一个数组保留在那里。类似jqr::jq('walk(if .group and type=="array" and length==1 then .[0] else . end)') 好点。我想出了.... %&gt;% jqr::jq('walk(if type=="object" and has("group") and (.group | type)=="array" and (.group | length)==1 then .group = .group[0] else . end)'),但我不是 jq pro。

以上是关于R:嵌套 data.table 到 JSON的主要内容,如果未能解决你的问题,请参考以下文章

将带有坐标的json文件嵌套到R中的数据框中

无法取消嵌套 json 文件以在 r 中创建地图?

在R中展平深层嵌套的json

将字符串转换为列表并嵌套在data.table中

如何在 R 中使用 tidyjson 处理嵌套的空 JSON 数组

使用 JSON 将嵌套对象发布到 Spring MVC 控制器