gpt4 book ai didi

json - Dart/Flutter中的Json oneOf获取FHIR资源

转载 作者:行者123 更新时间:2023-12-03 03:57:15 25 4
gpt4 key购买 nike

我正在尝试为Json中定义的FHIR资源创建Dart类。完整的Json schema for FHIR is here(如果有人想看)。我的问题是一个oneOf声明。具体来说,我有一个类似以下的类(尽管如果有人认为有帮助,我可以在这里不包括完整的类定义):

class Bundle_Entry {
Resource resource;

Bundle_Entry(this.resource});

factory Bundle_Entry.fromJson(Map<String, dynamic> json) => _$Bundle_EntryFromJson(json);
Map<String, dynamic> toJson() => _$Bundle_EntryToJson(this);
}

我的问题是ResourceList被定义为许多其他类中的一个。
"ResourceList": {
"oneOf": [
{ "$ref": "#/definitions/Account" },
{ "$ref": "#/definitions/ActivityDefinition" },
...
]
}

我尝试将'resource'变量声明为'var','dynamic'和'ResourceList'类型,并创建了仅包含资源的类ResourceList。

每个资源都有一个名为“resourceType”的字段,因此我也尝试创建一个ResourceList函数,该函数根据“resourceType”的参数返回不同的类型,这也不起作用。

如果我执行http请求,则我尝试解析的实际响应如下所示:
{
"resourceType": "Bundle",
"type": "searchset",
"entry": [
{
"resource": {
"name": "Jaba the Hutt"
"birthDate": "1980-07-27",
"id": "b26646dd-c549-4981-834e-bb4145d104b8",
"resourceType": "Patient"
}
}
]
}

任何建议,将不胜感激。

更新我的问题。有趣的是,第一个答案类似于我目前提出的答案。
class Bundle_Entry {
dynamic resource;
Bundle_Entry({this.resource});

Bundle_Entry.fromJson(Map<String, dynamic> json) =>
Bundle_Entry(
resource: json['resource'] == null
? null
: ResourceTypes(
json['resource']['resourceType'], json['resource'] as Map<String, dynamic>)
);}

Map<String, dynamic> toJson() => _$Bundle_EntryToJson(this);
}

dynamic ResourceTypes(String type, Map<String, dynamic> json) {
if (type == 'Element') return (new Element.fromJson(json));
if (type == 'Extension') return (new Extension.fromJson(json));
if (type == 'Patient') return (new Narrative.fromJson(json));

我的问题是,然后我必须对每个ResourceType进行硬编码,并且似乎应该有一种更简单的方法。

最佳答案

我一直在尝试建立类似的东西。我使用继承来处理它,并创建了一个函数来根据ResourceType字段返回资源。

Resource getResource(json) {
if(json == null) return null;
if(json["resourceType"] == "Patient") return Patient.fromJson(json);
if(json["resourceType"]=="Procedure") return Procedure.fromJson(json);
if(json["resourceType"]=="Encounter") return Encounter.fromJson(json);
if(json["resourceType"]=="Appointment") return Appointment.fromJson(json);
if(json["resourceType"]=="Slot") return Slot.fromJson(json);
if(json["resourceType"]=="Slot") return Slot.fromJson(json);
if(json["resourceType"]=="Observation") return Observation.fromJson(json);
if(json["resourceType"]=="Condition") return Condition.fromJson(json);
if(json["resourceType"]=="DiagnosticReport") return DiagnosticReport.fromJson(json);
if(json["resourceType"]=="MedicationRequest") return MedicationRequest.fromJson(json);
if(json["resourceType"]=="CarePlan") return CarePlan.fromJson(json);
if(json["resourceType"]=="Practitioner") return Practitioner.fromJson(json);
if(json["resourceType"]=="AllergyIntolerance") return AllergyIntolerance.fromJson(json);

return Resource.fromJson(json);
}

其中患者,程序等是资源的子类:
class Entry {
String fullUrl;
Resource resource;

factory Entry.fromJson(Map<String, dynamic> json) => Entry(
fullUrl: json["fullUrl"] == null ? null : json["fullUrl"],

//This line is the magic
resource: getResource(json["resource"]),
search: json["search"] == null ? null : Search.fromJson(json["search"]),
response: json["response"] == null
? null
: Response.fromJson(json["response"]),
);

关于json - Dart/Flutter中的Json oneOf获取FHIR资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60031008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com