如何将含命名嵌套列表的Dataframe转换为HL7-FHIR标准JSON
从R生成符合HL7-FHIR 4.0.1的Patient JSON
目标JSON结构
需要生成的FHIR Patient资源结构如下:
{ "resourceType": "Patient", "name": [ { "family": "Simpson", "given": [ "Homer", "Jay" ] } ], "gender": "male", "birthDate": "1956-5-12" }
问题分析
你尝试用Base R的data.frame和tibble构建数据结构时,都因为表格型数据与FHIR嵌套JSON结构不匹配,导致转换后的JSON不符合要求:
- Base R
data.frame:将嵌套列表拆分为多行,转换后出现字段重复、结构错乱。 tibble:将given定义为tibble,导致转换后变成键值对对象而非数组。
解决方案
方案1:直接构建嵌套列表(推荐)
FHIR JSON是层级嵌套结构,直接用R的列表来映射最贴合,无需通过DataFrame中转:
library(jsonlite) # 构建符合FHIR结构的嵌套列表 patient_list <- list( resourceType = "Patient", name = list( list( family = "Simpson", given = c("Homer", "Jay") ) ), gender = "male", birthDate = "1956-05-12" # 建议遵循FHIR日期格式规范:YYYY-MM-DD ) # 转换为JSON,auto_unbox=TRUE自动处理长度为1的向量,pretty=TRUE格式化输出 patient_json <- toJSON(patient_list, auto_unbox = TRUE, pretty = TRUE) cat(patient_json)
输出结果完全符合目标结构。
方案2:从DataFrame转换(若必须使用DataFrame)
如果需要基于DataFrame生成,需确保嵌套结构以列表形式存储在单元格中,而非拆分的表格:
library(jsonlite) library(tibble) # 构建单行tibble,name列存储嵌套列表 patient_df <- tibble( resourceType = "Patient", name = list( list( family = "Simpson", given = c("Homer", "Jay") ) ), gender = "male", birthDate = "1956-05-12" ) # 转换为JSON patient_json <- toJSON(patient_df, auto_unbox = TRUE, pretty = TRUE) cat(patient_json)
该方法生成的JSON同样符合FHIR标准。
错误原因说明
- Base R
data.frame问题:data.frame本质是列向量集合,会将I(list(family=..., given=...))解析为两列(family和given),进而生成两行数据,导致JSON转换时字段重复。 tibble问题:你将given定义为tibble("Homer", "Jay"),这会创建一个带默认列名的表格,转换为JSON时就变成了键值对对象,而FHIR要求given是字符串数组,应直接用向量c("Homer", "Jay")存储。
内容的提问来源于stack exchange,提问作者user12256545
相关产品推荐
相关产品推荐

