我正在使用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”
任何建议将不胜感激!
答案 0 :(得分:0)
只需编辑JSON。您可以使用gsub
或stringr
来完成。如果您使用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}]