Синтаксический анализ объекта типа данных общего назначения из 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);