R:嵌套 data.table 到 JSON

R: Nested data.table to JSON

我想从这样的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"
      }
  }
]

我们可以使用 jq 将拆箱作为 post 处理步骤,因为 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?