Asp.net web api 在asp.net web api中将HL7 FHIR序列化为json

Asp.net web api 在asp.net web api中将HL7 FHIR序列化为json,asp.net-web-api,hl7-fhir,datacontractjsonserializer,Asp.net Web Api,Hl7 Fhir,Datacontractjsonserializer,我正在使用由Ewout Kramer创建的HL7.Fhir包0.9.3 我将它与ASP.NET Web API捆绑在一起,但不幸的是,内置JSON序列化无法正确生成JSON。它包含很多这样的内容: "<IdentifierElement>k__BackingField" 但这将变得相当重复,并且没有遵循Web API的“按约定”json/xml序列化方法 是否有其他FHIR对象软件包可用,或者我应该自己编写吗?尽管HL7.FHIR NuGet软件包的较新版本(目前处于beta版)将

我正在使用由Ewout Kramer创建的HL7.Fhir包0.9.3

我将它与ASP.NET Web API捆绑在一起,但不幸的是,内置JSON序列化无法正确生成JSON。它包含很多这样的内容:

"<IdentifierElement>k__BackingField"
但这将变得相当重复,并且没有遵循Web API的“按约定”json/xml序列化方法


是否有其他FHIR对象软件包可用,或者我应该自己编写吗?

尽管HL7.FHIR NuGet软件包的较新版本(目前处于beta版)将带有额外的[DataContract]和[DataMember]属性,从而防止此类错误,标准.NET DataContract序列化程序将无法在内存中将POCO序列化为正确的FHIR XML和Json表示形式。FHIR序列化具有关于如何使用XML和json的特定规则,使用DataContract序列化程序的(有限的)可能性来配置这两个规则即使不是不可能,也是很困难的

但是,也没有必要像代码片段中显示的那样为每个调用调用调用FhirSerializer(事实上,这是一种WebApi反模式)。例如,我们的FHIR服务器(at)基于WebApi,并使用自定义MediaTypeFormatter来处理此问题。为了了解这是什么样子,我们创建了两个格式化程序,一个用于json,另一个用于xml:

public class JsonFhirFormatter : MediaTypeFormatter
{
        public JsonFhirFormatter() : base()
        {
            foreach (var mediaType in ContentType.JSON_CONTENT_HEADERS)
                SupportedMediaTypes.Add(new MediaTypeHeaderValue(mediaType));
        }
}
这告诉框架,此格式化程序将采用ContentType.JSON_CONTENT_头中的任何格式(即application/JSON和一些常见变体),并且能够解析和读取FHIR模型类型:

public override bool CanReadType(Type type)
{
    return type == typeof(ResourceEntry) || type == typeof(Bundle) || (type == typeof(TagList));
}

public override bool CanWriteType(Type type)
{
    return type == typeof(ResourceEntry) || type == typeof(Bundle) || (type == typeof(TagList)) || type == typeof(OperationOutcome);
}
最后,您必须重写ReadFromStreamAsync和WriteToStreamAsync方法:

public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
{
    // Some code left out...
    XmlWriter writer = new XmlTextWriter(writeStream, Encoding.UTF8);

    if (type == typeof(ResourceEntry))
    {
        ResourceEntry entry = (ResourceEntry)value;
        FhirSerializer.SerializeResource(entry.Resource, writer);

        content.Headers.SetFhirTags(entry.Tags);
    }
现在,一旦完成此操作,控制器就可以简单地执行以下操作:

[HttpGet, Route("metadata")]
public ResourceEntry Metadata()
{
   return service.Conformance();
}

[HttpOptions, Route("")]
public ResourceEntry Options()
{
   return service.Conformance();
}

请注意,我们的服务器不使用资源作为控制器中的参数和返回值。资源不允许您捕获重要的元数据(如id、版本id、上次修改日期等)。通过在我的控制器中使用ResourceEntry,这些数据可以与资源数据一起传递,WebApi框架可以将这些元数据绑定到适当的HTTP头。

谢谢。我仍然在使用稳定的0.9.3NuGet包,因此遗漏了一些东西,但这确实很有帮助。您在第3个代码块中发布了XML片段,而不是JSON代码块,但我明白了。谢谢:)@Ewout,您可以向元数据方法添加
[HttpOptions…]
属性。您不需要添加额外的方法。@e但您创建了自定义类JsonFhirFormatter。但如何将此格式化程序附加到控制器的方法(即Metadata())。
[HttpGet, Route("metadata")]
public ResourceEntry Metadata()
{
   return service.Conformance();
}

[HttpOptions, Route("")]
public ResourceEntry Options()
{
   return service.Conformance();
}