我想从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"
}
]
它保留了列表项的名称,但结构仍然不正确,因为它在错误的位置创建了数组。
1条答案
按热度按时间nhaq1z211#
不要在内部使用
tibble
,而是使用'list。将产生
如果还需要去掉外部的
[]
,则可以