如何将包含命名嵌套列表的Dataframe转换为JSON

o2gm4chl  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(113)

我想从Dataframe创建一个JSON对象,生成的JSON对象(遵循HL7- FHIR版本4.0.1)应该如下所示:

{
  "resourceType": "Patient",
  "name": [
    { "family": "Simpson", "given": [ "Homer", "Jay" ] }
     ],
  "gender": "male",
  "birthDate": "1956-5-12"
}

“name”资源包含一个具有两个元素的数组(有序列表),“family”具有数据类型string和“given”,数组包含一个或多个字符串。
如果我尝试从 Dataframe 创建这个JSON,我会遇到一些问题:
使用base R时,我试图通过使用I()(不适用于嵌套列表)保护列表来将其合并到 Dataframe 中。

library(jsonlite)

> # Base R
> patient_df <- data.frame(
+   resourceType = "Patient",
+   name = I(list(family= "Simpson", given = I(list("Homer", "Jay")))),
+   gender = "male",
+   birthDate = "1956-5-12"
+ )

> patient_df
       resourceType       name gender birthDate
family      Patient    Simpson   male 1956-5-12
given       Patient Homer, Jay   male 1956-5-12

这将创建一个包含两行的 Dataframe ,因此我尝试以以下方式调用toJSON

> toJSON(patient_df,dataframe="columns",pretty = T)
{
  "resourceType": ["Patient", "Patient"],
  "name": [
    ["Simpson"],
    [
      ["Homer"],
      ["Jay"]
    ]
  ],
  "gender": ["male", "male"],
  "birthDate": ["1956-5-12", "1956-5-12"],
  "_row": ["family", "given"]
}

这将为每个值创建单独的数组,同时重复其他值并添加一个“行”元素。
我还尝试使用tibbles,因为它们可以在列中包含更复杂的结构

library(tidyverse)
> patient_df_tidy <-tibble(
+   resourceType = "Patient",
+   name = tibble(family= "Simpson", given = tibble("Homer", "Jay")),
+   gender = "male",
+   birthDate = "1956-5-12"
+ )

> patient_df_tidy
# A tibble: 1 × 4
  resourceType name$family $given$`"Homer"` $$`"Jay"` gender birthDate
  <chr>        <chr>       <chr>            <chr>     <chr>  <chr>    
1 Patient      Simpson     Homer            Jay       male   1956-5-12

这给了我一个更好的单行,但是我仍然没有得到正确的json:

> toJSON(patient_df_tidy,
+        auto_unbox = T,
+        pretty = T)

[
  {
    "resourceType": "Patient",
    "name": {
      "family": "Simpson",
      "given": {
        "\"Homer\"": "Homer",
        "\"Jay\"": "Jay"
      }
    },
    "gender": "male",
    "birthDate": "1956-5-12"
  }
]

它保留了列表项的名称,但结构仍然不正确,因为它在错误的位置创建了数组。

nhaq1z21

nhaq1z211#

不要在内部使用tibble,而是使用'list。

patient_df_tidy <-tibble(
     resourceType = "Patient",
     name = list(list(family= "Simpson", given = list("Homer", "Jay"))),
     gender = "male",
     birthDate = "1956-5-12"
  )
 
jsonlite::toJSON(patient_df_tidy,
                auto_unbox = T,
                pretty = T)

将产生

[
  {
    "resourceType": "Patient",
    "name": {
      "family": "Simpson",
      "given": [
        "Homer",
        "Jay"
      ]
    },
    "gender": "male",
    "birthDate": "1956-5-12"
  }
]

如果还需要去掉外部的[],则可以

jsonlite::toJSON(as.list(patient_df_tidy),
                auto_unbox = T,
                pretty = T)

相关问题