Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion common
42 changes: 32 additions & 10 deletions src/Hl7.Fhir.Core.Tests/Serialization/SerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,17 @@
* available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE
*/

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Hl7.Fhir.Introspection;
using Hl7.Fhir.Model;
using Hl7.Fhir.Serialization;
using Hl7.Fhir.Utility;
using Hl7.Fhir.Introspection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using Hl7.Fhir.ElementModel;

namespace Hl7.Fhir.Tests.Serialization
{
Expand Down Expand Up @@ -57,9 +56,9 @@ public void ParseMetaXml()
public void ParsePatientXmlNullType()
{
string xmlPacientTest = TestDataHelper.ReadTestData("TestPatient.xml");

var poco = new FhirXmlParser().Parse(xmlPacientTest);

Assert.AreEqual(((Patient)poco).Id, "pat1");
Assert.AreEqual(((Patient)poco).Contained.First().Id, "1");
Assert.AreEqual(((Patient)poco).Name.First().Family, "Donald");
Expand Down Expand Up @@ -195,7 +194,7 @@ public void TestDecimalPrecisionSerializationInJson()
var ext = new FhirDecimal(dec6);
var obs = new Observation();
obs.AddExtension("http://example.org/DecimalPrecision", ext);

var json = FhirJsonSerializer.SerializeToString(obs);
var obs2 = FhirJsonParser.Parse<Observation>(json);

Expand Down Expand Up @@ -230,7 +229,7 @@ public void TestParseUnkownPolymorphPropertyInJson()
{
var dec6 = 6m;
var ext = new FhirDecimal(dec6);
var obs = new Observation{ Value = new FhirDecimal(dec6) };
var obs = new Observation { Value = new FhirDecimal(dec6) };
var json = FhirJsonSerializer.SerializeToString(obs);
try
{
Expand Down Expand Up @@ -275,7 +274,7 @@ public void TryScriptInject()

var xml = FhirXmlSerializer.SerializeToString(x);
Assert.IsFalse(xml.Contains("<script"));
}
}


[TestMethod]
Expand Down Expand Up @@ -368,7 +367,7 @@ public void SerializeJsonWithPlainDiv()

string json = TestDataHelper.ReadTestData(@"valueset-v2-0717.json");
Assert.IsNotNull(json);
var parser = new FhirJsonParser { Settings = { PermissiveParsing = true} };
var parser = new FhirJsonParser { Settings = { PermissiveParsing = true } };
var vs = parser.Parse<ValueSet>(json);
Assert.IsNotNull(vs);

Expand Down Expand Up @@ -556,7 +555,7 @@ public void DateTimeOffsetAccuracyTest()
Assert.IsTrue(patient.IsExactly(res), "1");

// Is the parsing still correct without milliseconds?
patient = new Patient { Meta = new Meta { LastUpdated = new DateTimeOffset(2018, 8, 13, 13, 41, 56, TimeSpan.Zero)} };
patient = new Patient { Meta = new Meta { LastUpdated = new DateTimeOffset(2018, 8, 13, 13, 41, 56, TimeSpan.Zero) } };
json = "{\"resourceType\":\"Patient\",\"meta\":{\"lastUpdated\":\"2018-08-13T13:41:56+00:00\"}}";
res = new FhirJsonParser().Parse<Patient>(json);
Assert.IsTrue(patient.IsExactly(res), "2");
Expand Down Expand Up @@ -594,5 +593,28 @@ public void SerializerHandlesEmptyChildObjects()

Assert.AreEqual(1, newPoco.Name.Count);
}

[TestMethod]
public void IncludeMandatoryInElementsSummaryTest()
{
Observation obs = new()
{
Status = ObservationStatus.Final,
Issued = DateTimeOffset.Now
};

// default behavior
var json = new FhirJsonSerializer().SerializeToDocument(obs, elements: new[] { "issued" });

Assert.IsTrue(json.ContainsKey("issued"));
Assert.IsFalse(json.ContainsKey("status"));

// Adding mandatory elements to the set of elements
json = new FhirJsonSerializer(new SerializerSettings() { IncludeMandatoryInElementsSummary = true })
.SerializeToDocument(obs, elements: new[] { "issued" });

Assert.IsTrue(json.ContainsKey("issued"));
Assert.IsTrue(json.ContainsKey("status"));
}
}
}
9 changes: 6 additions & 3 deletions src/Hl7.Fhir.Core/Serialization/BaseFhirSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
* available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE
*/

using Hl7.Fhir.ElementModel;
using Hl7.Fhir.Model;
using Hl7.Fhir.Rest;
using Hl7.Fhir.ElementModel;
using System.Linq;
using Hl7.Fhir.Utility;
using System.Linq;

namespace Hl7.Fhir.Serialization
{
Expand All @@ -24,6 +24,9 @@ public BaseFhirSerializer(SerializerSettings settings)
}

protected static ITypedElement MakeElementStack(Base instance, SummaryType summary, string[] elements)
=> MakeElementStack(instance, summary, elements, false);

protected static ITypedElement MakeElementStack(Base instance, SummaryType summary, string[] elements, bool includeMandatoryInElementsSummary)
{
if (summary == SummaryType.False && elements == null) return instance.ToTypedElement();

Expand All @@ -47,7 +50,7 @@ protected static ITypedElement MakeElementStack(Base instance, SummaryType summa
case SummaryType.Count:
return MaskingNode.ForCount(baseNav);
case SummaryType.False:
return MaskingNode.ForElements(baseNav, elements);
return MaskingNode.ForElements(baseNav, elements, includeMandatoryInElementsSummary);
default:
return baseNav;
}
Expand Down
15 changes: 7 additions & 8 deletions src/Hl7.Fhir.Core/Serialization/FhirJsonSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
* available at https://raw.githubusercontent.com/FirelyTeam/firely-net-sdk/master/LICENSE
*/

using System;
using Hl7.Fhir.Model;
using Hl7.Fhir.Rest;
using Newtonsoft.Json;
Expand All @@ -23,16 +22,16 @@ public FhirJsonSerializer(SerializerSettings settings = null) : base(settings)
private FhirJsonSerializationSettings buildFhirJsonWriterSettings() =>
new FhirJsonSerializationSettings { Pretty = Settings.Pretty, AppendNewLine = Settings.AppendNewLine };

public string SerializeToString(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
MakeElementStack(instance, summary, elements).ToJson(buildFhirJsonWriterSettings());
public string SerializeToString(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false).ToJson(buildFhirJsonWriterSettings());

public byte[] SerializeToBytes(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
MakeElementStack(instance, summary, elements).ToJsonBytes(buildFhirJsonWriterSettings());
public byte[] SerializeToBytes(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false).ToJsonBytes(buildFhirJsonWriterSettings());

public JObject SerializeToDocument(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
MakeElementStack(instance, summary, elements).ToJObject(buildFhirJsonWriterSettings());
public JObject SerializeToDocument(Base instance, SummaryType summary = SummaryType.False, string[] elements = null) =>
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false).ToJObject(buildFhirJsonWriterSettings());

public void Serialize(Base instance, JsonWriter writer, SummaryType summary = SummaryType.False, string[] elements = null) =>
MakeElementStack(instance, summary, elements).WriteTo(writer, buildFhirJsonWriterSettings());
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false).WriteTo(writer, buildFhirJsonWriterSettings());
}
}
15 changes: 7 additions & 8 deletions src/Hl7.Fhir.Core/Serialization/FhirXmlSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,38 +9,37 @@
using Hl7.Fhir.Model;
using Hl7.Fhir.Rest;
using Hl7.Fhir.Utility;
using System;
using System.Xml;
using System.Xml.Linq;

namespace Hl7.Fhir.Serialization
{
public class FhirXmlSerializer : BaseFhirSerializer
{
public FhirXmlSerializer(SerializerSettings settings=null) : base(settings)
public FhirXmlSerializer(SerializerSettings settings = null) : base(settings)
{
}

private FhirXmlSerializationSettings buildFhirXmlWriterSettings() =>
new FhirXmlSerializationSettings { Pretty = Settings.Pretty, AppendNewLine = Settings.AppendNewLine, TrimWhitespaces = Settings.TrimWhiteSpacesInXml };

public string SerializeToString(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
MakeElementStack(instance, summary, elements)
public string SerializeToString(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false)
.Rename(root)
.ToXml(settings: buildFhirXmlWriterSettings());

public byte[] SerializeToBytes(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
MakeElementStack(instance, summary, elements)
public byte[] SerializeToBytes(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false)
.Rename(root)
.ToXmlBytes(settings: buildFhirXmlWriterSettings());

public XDocument SerializeToDocument(Base instance, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
MakeElementStack(instance, summary, elements)
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false)
.Rename(root)
.ToXDocument(buildFhirXmlWriterSettings()).Rename(root);

public void Serialize(Base instance, XmlWriter writer, SummaryType summary = SummaryType.False, string root = null, string[] elements = null) =>
MakeElementStack(instance, summary, elements)
MakeElementStack(instance, summary, elements, Settings?.IncludeMandatoryInElementsSummary ?? false)
.Rename(root)
.WriteTo(writer, settings: buildFhirXmlWriterSettings());
}
Expand Down