toJSON без внешних квадратных скобок - PullRequest
0 голосов
/ 09 мая 2019

Я преобразую вложенный список определенной структуры (требуется API) в JSON, используя toJSON () в jsonlite. Однако мне нужно, чтобы окончательный 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, row.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"

Любой совет будет с благодарностью!

1 Ответ

0 голосов
/ 09 мая 2019

Просто отредактируйте 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
    }
  ]
} 

Я оставлю вам право написать соответствующее регулярное выражение для выполнения необходимых замен.

...