没有外部方括号的toJSON

时间:2019-05-09 06:05:06

标签: r purrr jsonlite

我正在使用jsonlite中的toJSON()将特定结构(API要求)的嵌套列表转换为JSON。但是,我需要最终的JSON不包含外部方括号(API也需要)。

test_list <- list(
    list(formName = "test_title", user_id = "test_userid", rows = list(list(row = 0))), 
    list(formName = "test_title2", user_id = "test_userid2", rows = list(list(row = 0)))
)

jsonlite::toJSON(test_list, pretty = TRUE, auto_unbox = TRUE)

哪个给:

[
  {
    "formName": "test_title",
    "user_id": "test_userid",
    "rows": [
      {
        "row": 0
      }
    ]
  },
  {
    "formName": "test_title2",
    "user_id": "test_userid2",
    "rows": [
      {
        "row": 0
      }
    ]
  }
] 

但是我需要删除第一个和最后一个方括号。

我可以使用purrr :: flatten()删除列表的顶层,从而删除JSON中的方括号,但是toJSON()似乎不喜欢列表具有重复的名称,并将其重命名到name.1,name.2,name.3等(API也不允许)。

也就是说:

jsonlite::toJSON(test_list %>% purrr::flatten(), pretty = TRUE, auto_unbox = TRUE)

删除了外部方括号,但将第二个元素中的名称转换为formName.1,user_id.1,rows.1,如下所示:

{
  "formName": "test_title",
  "user_id": "test_userid",
  "rows": [
    {
      "row": 0
    }
  ],
  "formName.1": "test_title2",
  "user_id.1": "test_userid2",
  "rows.1": [
    {
      "row": 0
    }
  ]
}

但这就是我所需要的:

{
  "formName": "test_title",
  "user_id": "test_userid",
  "rows": [
    {
      "row": 0
    }
  ],
  "formName": "test_title2",
  "user_id": "test_userid2",
  "rows": [
    {
      "row": 0
    }
  ]
}

也就是说,formName,user_ud和第二个JSON元素中的行未附加“ .1”

任何建议将不胜感激!

2 个答案:

答案 0 :(得分:0)

只需编辑JSON。您可以使用gsubstringr来完成。如果您使用stringr函数,它将丢失它的"json"类,但是您可以放回它:

> x = jsonlite::toJSON(test_list %>% purrr::flatten(), pretty = TRUE, auto_unbox = TRUE)
> gsub("user_id\\.1", "user_id", x)
{
  "formName": "test_title",
  "user_id": "test_userid",
  "rows": [
    {
      "row": 0
    }
  ],
  "formName.1": "test_title2",
  "user_id": "test_userid2",
  "rows.1": [
    {
      "row": 0
    }
  ]
}

> y = stringr::str_replace_all(x, "user_id\\.1", "user_id")
> class(y) = "json"
> y
{
  "formName": "test_title",
  "user_id": "test_userid",
  "rows": [
    {
      "row": 0
    }
  ],
  "formName.1": "test_title2",
  "user_id": "test_userid2",
  "rows.1": [
    {
      "row": 0
    }
  ]
} 

我将留给您编写适当的正则表达式以进行所需的替换。

答案 1 :(得分:0)

这似乎有效(丑陋但简单):

df = data.frame(a=1,b=2)
js = toJSON(unbox(fromJSON(toJSON(df))))
> js
{"a":1,"b":2} 

出于某种原因,auto_unbox=T 不起作用:

> toJSON(df,auto_unbox = T)
[{"a":1,"b":2}]