Синтаксический разбор объектов типа данных FHIR с JSON in. NET Core - PullRequest
0 голосов
/ 24 января 2020

Я использую библиотеку Hl7.Fhir.R4 в своем проекте, которая представляет собой API Wrapper (в ASP. NET Core 2.2) вокруг Azure API для 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 ]

0 голосов
/ 04 февраля 2020

Вы упомянули, что используете 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);
0 голосов
/ 25 января 2020

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

...