【问题标题】:FHIR's General-Purpose Data Type Object Parsing From JSON in .NET CoreFHIR 的通用数据类型对象从 .NET Core 中的 JSON 解析
【发布时间】:2020-01-24 11:08:45
【问题描述】:

我在我的项目中使用Hl7.Fhir.R4 库,它是Azure API for FHIR 周围的API 包装器(在ASP.NET Core 2.2 中)。 在视图模型中,我将 FHIR 元素 (FHIR's General-Purpose Data Type) 声明为属性。示例:

public class MyPatient
{
    public string Name { get; set;}
    public Hl7.Fhir.Model.CodeableConcept MaritalStatus { get; set;} //This is 
                                                          //defined in the library
} 

现在,问题是:'MaritalStatus' 没有正确地从 json 解析到 c# 对象 (defined in the library)(即它只是 'not null')。也没有抛出任何异常。

详细解释: 这是我从前端收到的 JSON:

 { 
   "name": "TheName", 
   "maritalStatus": {
      "coding": [ 
         { 
           "system": "terminology.hl7.org/CodeSystem/v3-MaritalStatus", 
           "code": "U", 
           "display": "unmarried"
         } 
       ], 
      "text": "Unmarried" 
    } 
}

这是我从前端收到的 JSON 模型(C# 类):

public class MyPatient
{
    public string Name { get; set;}
    public Hl7.Fhir.Model.CodeableConcept MaritalStatus { get; set;}
} 

这是满足请求的控制器操作(在包装层 - 我的项目中):

        [HttpPut("{id}")]
        [Consumes("application/json")]
        [Produces("application/json")]
        public async Task<ActionResult> Update([Required][FromRoute] string id,[Required][FromBody] MyPatient myPatient)
        {
            if (ModelState.IsValid)
            {

               Hl7.Fhir.Model.Patient patient = await _fhirClient.ReadAsync<Patient>(location: "Patient/" + id);

               patient.MaritalStatus = myPatient.MaritalStatus;

               patient.Name[0].Text = myPatient.Name;

               patient = await _fhirClient.UpdateAsync<Patient>(patient);

               return Ok();

            }//ends If ModelState.IsValid

            return BadRequest();
        }//ends Update

【问题讨论】:

  • 你能详细说明你在做什么吗?你是怎么解析的,json是什么样子的?当您说您正在使用官方库时,为什么不解析为常规 FHIR Patient 对象?为什么需要“MyPatient”类?
  • 1.我需要更新 Azure FHIR Db 中的患者 FHIR 资源。我从前端获取 JSON 格式的“maritalStatus”对象,Json.NET(.NET Core 中的默认 JSON 解析器)将该对象解析为 C# 对象(类型:CodeableConcept)。然后我将这个 C# 对象的引用存储在检索到的 FHIR 资源 Patient.MaritalStatus 中。最后,我使用这个本地更新的对象对 Azure FHIR 服务器进行更新调用。 2. 我正在使用 .NET Core 中的默认 JSON 转换器进行解析。 3. 我需要允许用户仅部分更新患者对象(即“MaritalStatus”)。
  • json 看起来像: { "name": "TheName", "maritalStatus": { "coding": [ { "system": "terminology.hl7.org/CodeSystem/v3-MaritalStatus", "code": "U" , "display": "unmarried" } ], "text": "Unmarried" } }
  • 我只需要解析“CodeableConcept”类型的“maritalStatus”,它是从包装层的前端获取的。因此,不可能将其解析为整个 Patient FHIR 对象。 @MirjamBaltus

标签: asp.net-core types hl7-fhir jsonparser fhir-net-api


【解决方案1】:

首先,您的实例不是有效的 FHIR。您需要遵守 FHIR 规范中定义的语法 - Patient 上的“姓名”不是一个简单的字符串。同样,您需要声明资源类型。这不是可选的。其次,如果你想使用官方库,你不能去发明你自己的类并期望它们神奇地工作——使用内置的解析器。即使您只存在两个元素(加上 resourceType),它也会非常好。

【讨论】:

  • 请您再次阅读问题和 cmets。很抱歉,但我认为您的回答根本不相关。这整个问题实际上是关于在 Azure FHIR 服务器周围的包装层中的视图模型和 FHIR 域模型之间的映射。
  • 我的评论是关于你的 JSON - 它不是有效的 FHIR。 (如果您想验证,请尝试将其发布到任何公共 FHIR 测试服务器。)因此,解析器出现问题也就不足为奇了。此外,您的代码片段似乎没有执行任何映射。它只是定义一个新类。
  • 我已经将问题解释到足够的描述性水平。我希望现在你会明白你的答案是不相关的。谢谢。
【解决方案2】:

您提到使用 .Net Core 的默认 JSON 转换器,所以我假设这是 System.Text.Json 中的那个。

问题不在于 FHIR 库,因为它完全能够将 FHIR json 正确解析为 FHIR 对象。因此,您必须查看用于自定义类的 JSON 转换器,并让它正确地将 json 解析到您的类对象中。看着那个,我认为问题是大小写不匹配。 This documentation 表示属性名匹配区分大小写。 FHIR 属性使用驼峰式,但 FHIR 模型的属性以大写开头。要解决这个问题,请设置您的序列化属性,并将它们用于反序列化:

        var serializerOptions = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true
        };

        var myPatient = JsonSerializer.Deserialize<MyPatient>(json, serializerOptions);

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多