diff --git a/src/Hl7.Fhir.Base/Serialization/BaseFhirJsonPocoSerializer.cs b/src/Hl7.Fhir.Base/Serialization/BaseFhirJsonPocoSerializer.cs index 6cf24db4ea..0d978d33d9 100644 --- a/src/Hl7.Fhir.Base/Serialization/BaseFhirJsonPocoSerializer.cs +++ b/src/Hl7.Fhir.Base/Serialization/BaseFhirJsonPocoSerializer.cs @@ -15,6 +15,7 @@ using Hl7.Fhir.Specification; using Hl7.Fhir.Utility; using System; +using System.Buffers; using System.Collections; using System.Collections.Generic; using System.IO; @@ -271,12 +272,35 @@ private void serializeFhirPrimitive(string elementName, PrimitiveType value, Utf if (value.HasElements) { - // Write a property with '_elementName' - writer.WritePropertyName("_" + elementName); - serializeInternal(value, writer, skipValue: true); + deferSerializeForFilter(elementName, value, writer); } } + private void deferSerializeForFilter(string elementName, PrimitiveType value, Utf8JsonWriter writer) + { +#if NETSTANDARD2_0 + var data = new MemoryStream(); +#else + var data = new ArrayBufferWriter(); +#endif + using (var deferredWriter = new Utf8JsonWriter(data, writer.Options)) + { + serializeInternal(value, deferredWriter, skipValue: true); + } + +#if NETSTANDARD2_0 + var bytes = data.ToArray(); +#else + var bytes = data.WrittenSpan; +#endif + if(bytes.Length < 3) return; + + // Write a property with '_elementName' + writer.WritePropertyName("_" + elementName); + // write the deferred value + writer.WriteRawValue(bytes, skipInputValidation: true); + } + /// /// Serialize a primitive .NET value that may occur in the POCOs into Json. /// diff --git a/src/Hl7.Fhir.Support.Poco.Tests/NewPocoSerializers/SummaryFilterIntegrationTests.cs b/src/Hl7.Fhir.Support.Poco.Tests/NewPocoSerializers/SummaryFilterIntegrationTests.cs index 6f0eda32ca..0d399d7d87 100644 --- a/src/Hl7.Fhir.Support.Poco.Tests/NewPocoSerializers/SummaryFilterIntegrationTests.cs +++ b/src/Hl7.Fhir.Support.Poco.Tests/NewPocoSerializers/SummaryFilterIntegrationTests.cs @@ -4,6 +4,7 @@ using Hl7.Fhir.Model; using Hl7.Fhir.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; using System.Collections; using System.Collections.Generic; using System.IO; @@ -15,6 +16,20 @@ namespace Hl7.Fhir.Support.Poco.Tests [TestClass] public class SummaryFilterIntegrationTests { + [TestMethod] + public void SummaryHasNoEmptyObject() + { + var patient = new Patient + { + BirthDateElement = new Date("1990") + { + Extension = [new Extension("birthTime", new Instant(DateTimeOffset.Now))] + } + }; + var (original, summarized) = runSummarize(patient, SerializationFilter.ForSummary()); + summarized.Extension.Should().BeEmpty(); + } + [TestMethod] public void Basics() { @@ -152,14 +167,12 @@ public void SummaryCount() // check if result contains the link traverse(summarized).Should().ContainKey("link"); } - - private (T full, T summarized) runSummarize(string filename, SerializationFilter filter) where T : Resource + + + private (T full, T summarized) runSummarize(T full, SerializationFilter filter) where T : Resource { - var fullXml = File.ReadAllText(Path.Combine("TestData", filename)); - var full = FhirXmlNode.Parse(fullXml).ToPoco(ModelInspector.ForType()); - var options = new JsonSerializerOptions() - .ForFhir(typeof(Patient).Assembly, new FhirJsonPocoSerializerSettings { SummaryFilter = filter }) + .ForFhir(typeof(Patient).Assembly, new FhirJsonPocoSerializerSettings() { SummaryFilter = filter }) .Pretty(); string summarizedJson = JsonSerializer.Serialize(full, options); @@ -168,6 +181,14 @@ public void SummaryCount() return (full, summarized); } + private (T full, T summarized) runSummarize(string filename, SerializationFilter filter) where T : Resource + { + var fullXml = File.ReadAllText(Path.Combine("TestData", filename)); + var full = FhirXmlNode.Parse(fullXml).ToPoco(); + + return runSummarize(full, filter); + } + private static IEnumerable> traverse(Base x) { return childrenAndMe(KeyValuePair.Create("(root)", (object)x));