Синтаксический анализ объекта типа данных общего назначения из JSON в .NET Core в FHIR

В своем проекте я использую библиотеку Hl7.Fhir.R4, которая представляет собой оболочку API (в ASP.NET Core 2.2) вокруг API Azure для FHIR. В модели представления я объявил элемент FHIR (тип данных общего назначения FHIR) как свойство. Пример:

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# (определенный в библиотеке) должным образом (т.е. он просто "не равен нулю"). Также не возникает никаких исключений.

Разъяснение с деталями: это JSON, который я получаю от внешнего интерфейса:

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

Это моя модель (класс C#) против JSON, который я получаю от внешнего интерфейса:

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

2 ответа

Во-первых, ваш экземпляр недействителен FHIR. Вам необходимо придерживаться синтаксиса, определенного в спецификации FHIR, а "имя" пациента - это не простая строка. Также вам необходимо объявить resourceType. Это не обязательно. Во-вторых, если вы хотите использовать официальную библиотеку, вы не можете изобретать свои собственные классы и ожидать, что они будут волшебным образом работать - используйте встроенный анализатор. Это будет прекрасно, даже если у вас есть только два элемента (плюс resourceType).

Вы упомянули об использовании конвертера JSON по умолчанию для.Net Core, поэтому я предполагаю, что это тот, который находится в System.Text.Json.

Проблема не в библиотеке FHIR, поскольку она прекрасно способна правильно разобрать FHIR json на объекты FHIR. Поэтому вам нужно будет взглянуть на конвертер JSON, который вы используете для своего пользовательского класса, и заставить его правильно анализировать json в вашем объекте класса. Глядя на это, я думаю, что проблема в несоответствии регистров. В этой документации указано, что при сопоставлении имен свойств учитывается регистр. В свойствах FHIR используется верблюжий регистр, но свойства модели FHIR начинаются с верхнего регистра. Чтобы обойти это, установите свойства сериализации и используйте их для десериализации:

        var serializerOptions = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true
        };

        var myPatient = JsonSerializer.Deserialize<MyPatient>(json, serializerOptions);
Другие вопросы по тегам