Fork on Github
Download the Nuget package
The last tutorial focused on serialising simple JSON objects. This tutorial contains a more complex example.
Real-world objects are generally more complex than typical “Hello, World” examples. Let’s build such an object; and object that contains complex properties, such as other objects and collections. We’ll start by defining a sub-object:
class SimpleSubObject: IHaveSerialisableProperties { public string Name { get; set; } public string Description { get; set; } public SerialisableProperties GetSerializableProperties() { return new SerialisableProperties("simpleSubObject", new List<JsonProperty> { new StringJsonProperty { Key = "name", Value = Name }, new StringJsonProperty { Key = "description", Value = Description } }); } }
This object contains 2 simple properties; Name
and Description
. As before, we implement the IHaveSerialisableProperties
interface to allow JSON# to serialise the object. Now let’s define an object with a property that is a collection of SimpleSubObjects
:
class ComplexObject: IHaveSerialisableProperties { public string Name { get; set; } public string Description { get; set; } public List<SimpleSubObject> SimpleSubObjects { get; set; } public List<double> Doubles { get; set; } public SerialisableProperties GetSerializableProperties() { return new SerialisableProperties("complexObject", new List&lt;JsonProperty&gt; { new StringJsonProperty { Key = "name", Value = Name }, new StringJsonProperty { Key = "description", Value = Description } }, new List<JsonSerialisor> { new ComplexJsonArraySerialisor("simpleSubObjects", SimpleSubObjects.Select(c =&gt; c.GetSerializableProperties())), new JsonArraySerialisor("doubles", Doubles.Select(d =&gt; d.ToString(CultureInfo.InvariantCulture)), JsonPropertyType.Numeric) }); } }
This object contains some simple properties, as well as 2 collections; the first, a collection of Double
, the second, a collection of SimpleSubObject
type.
Note the GetSerializableProperties
method in ComplexObject
. It accepts a collection parameter of type JsonSerialisor
, whichrepresents the highest level of abstraction in terms of the core serialisation components in JSON#. In order to serialise our collection of SimpleSubObjects
, we leverage an implementation of JsonSerialisor
called ComplexJsonArraySerialisor
, designed specifically to serialise collections of objects, as opposed to primitive types. Given that each SimpleSubObject
in our collection contains an implementation of GetSerializableProperties
, we simply pass the result of each method to the ComplexJsonArraySerialisor
constructor. It will handle the rest.
We follow a similar process to serialise the collection of Double, in this case leveraging JsonArraySerialisor, another implementation of JsonSerialisor, specifically designed to manage collections of primitive types. We simply provide the collection of Double in their raw format to the serialisor.
Let’s instantiate a new instance of ComplexObject:
var complexObject = new ComplexObject { Name = "Complex Object", Description = "A complex object", SimpleSubObjects = new List<SimpleSubObject> { new SimpleSubObject { Name = "Sub Object #1", Description = "The 1st sub object" }, new SimpleSubObject { Name = "Sub Object #2", Description = "The 2nd sub object" } }, Doubles = new List<double> { 1d, 2.5d, 10.8d } };
As per the previous tutorial, we serialise as follows:
var writer = new BinaryWriter(new MemoryStream(), new UTF8Encoding(false)); var serialisableProperties = complexObject.GetSerializableProperties(); using (var serialisor = new StandardJsonSerialisationStrategy(writer)) Json.Serialise(serialisor, new JsonPropertiesSerialisor(serialisableProperties));
Note the use of StandardJsonSerialisationStrategy
here. This is the only implementation of JsonSerialisationStrategy
, one of the core serialisation components in JSON#. The abstraction exists to provide extensibility, so that different strategies might be applied at runtime, should specific serialisation rules vary across requirements.
In the next tutorial I’ll discuss deserialising objects using JSON#.
Connect with me: