Изменение структуры данных для записи в JSON

#r #json #brackets #dataformat

#r #json #скобки #формат данных

Вопрос:

Привет, я хотел бы изменить структуру данных, которые я записываю в JSON, но я не уверен, как это сделать.

это мой код:

 test_df <- data.frame(Metric = c("test1",
                                 "test2",
                                 "test3",
                                 "test4",
                                 "test5"),
                      Value = c(tail(test1$v, 1), 
                                tail(test2$v, 1),
                                tail(test3$v, 1),
                                tail(test4$v, 1),
                                tail(test5$v, 1)))
                                              


test_df_list <- list(test_df)

names(test_df_list) <- "test_df_df"

test_df_exportJSON <- toJSON(test_df_list, pretty = TRUE)

write(test_df_exportJSON, "test_df.json") 
 

С результатом:

 {
  "test_df": [
    {
      "Metric": "test1",
      "Value": 47
    },
    {
      "Metric": "test2",
      "Value": 0.85
    },
    {
      "Metric": "test3",
      "Value": 0.98
    },
    {
      "Metric": "test4",
      "Value": 137
    },
    {
      "Metric": "test5",
      "Value": 2.1
    }
  ]
}
 

Но я хотел бы, чтобы [] был удален, как:

 {
  "test_df": 
    {
      "test1": 47,
      "test2": 0.85,
       "test3": 0.98,
       "test4": 137,
       "test5": 2.1
    }
}
 

Есть идеи, как это сделать? Любая помощь была бы отличной!

Каким-то образом я получаю сообщение «Похоже, что ваш пост в основном состоит из кода; пожалуйста, добавьте еще несколько деталей», поэтому игнорируйте эту строку, чтобы она была принята 😉

Ответ №1:

Вы можете удалить Metric при создании списка и добавить его в качестве имен к элементам списка позже. Также разделить Value на отдельные элементы списка. Поскольку у меня нет ваших test1 данных под рукой, я создал пример ниже.

 library(jsonlite)
test_df <- data.frame(Metric = c('test1','test2','test3','test4','test5'),
                      Value = c(4,6,2,8,7))

names <- as.vector(test_df$Metric)

test_df_list <- structure(split(test_df$Value, seq(nrow(test_df))), names = names)

test_df_list <- list(test_df = test_df_list)

toJSON(test_df_list, pretty = TRUE, auto_unbox = TRUE)
 

Даст

 {
  "test_df": {
    "test1": 4,
    "test2": 6,
    "test3": 2,
    "test4": 8,
    "test5": 7
  }
} 
 

Если вы remove auto_unbox = TRUE из toJSON() значений будете в квадратных скобках [
].
Это то, что сработало для меня, но, возможно, кто-то придумает более удобное решение.

Комментарии:

1. Да! Работает! Спасибо!

2. @H.berg Приятно знать, что это сработало! Способ jsonlite преобразования или другие пакеты всегда будут зависеть от структуры вашего фрейма данных или списка. Однако иногда бывает сложно найти правильную структуру.