From 220f746d215c95c3a6694153c9b127d747366a3e Mon Sep 17 00:00:00 2001 From: Chris Cameron Date: Fri, 16 Feb 2018 11:50:26 -0500 Subject: [PATCH] Extensions for serializing/deserializing arrays and dicts to/from JSON --- ICD.Common.Utils/Extensions/JsonExtensions.cs | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/ICD.Common.Utils/Extensions/JsonExtensions.cs b/ICD.Common.Utils/Extensions/JsonExtensions.cs index 42834c9..5721159 100644 --- a/ICD.Common.Utils/Extensions/JsonExtensions.cs +++ b/ICD.Common.Utils/Extensions/JsonExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using ICD.Common.Properties; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -126,5 +127,129 @@ namespace ICD.Common.Utils.Extensions return EnumUtils.Parse(extends.GetValueAsString(), true); return (T)(object)extends.GetValueAsInt(); } + + /// + /// Serializes the given sequence of items to the writer. + /// + /// + /// + /// + /// + public static void SerializeArray(this JsonSerializer extends, JsonWriter writer, IEnumerable items) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (writer == null) + throw new ArgumentNullException("writer"); + + if (items == null) + throw new ArgumentNullException("items"); + + writer.WriteStartArray(); + { + foreach (TItem item in items) + extends.Serialize(writer, item); + } + writer.WriteEndArray(); + } + + /// + /// Deserializes an array of items from the reader's current value. + /// + /// + /// + /// + public static IEnumerable DeserializeArray(this JsonSerializer extends, JsonReader reader) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (reader == null) + throw new ArgumentNullException("reader"); + + if (reader.TokenType == JsonToken.Null) + yield break; + + if (reader.TokenType != JsonToken.StartArray) + throw new FormatException(string.Format("Expected token {0} got {1}", JsonToken.StartArray, reader.TokenType)); + + // Step into the first value + reader.Read(); + + while (reader.TokenType != JsonToken.EndArray) + { + TItem output = extends.Deserialize(reader); + yield return output; + } + } + + /// + /// Serializes the given sequence of key-value-pairs to the writer. + /// + /// + /// + /// + /// + /// + public static void SerializeDictionary(this JsonSerializer extends, JsonWriter writer, + IEnumerable> items) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (writer == null) + throw new ArgumentNullException("writer"); + + if (items == null) + throw new ArgumentNullException("items"); + + writer.WriteStartObject(); + { + foreach (KeyValuePair kvp in items) + { + writer.WritePropertyName(kvp.Key.ToString()); + extends.Serialize(writer, kvp.Value); + } + } + writer.WriteEndObject(); + } + + /// + /// Deserializes a dictionary of items from the reader's current value. + /// + /// + /// + /// + /// + public static IEnumerable> DeserializeDictionary(this JsonSerializer extends, JsonReader reader) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (reader == null) + throw new ArgumentNullException("reader"); + + if (reader.TokenType == JsonToken.Null) + yield break; + + if (reader.TokenType != JsonToken.StartObject) + throw new FormatException(string.Format("Expected token {0} got {1}", JsonToken.StartObject, reader.TokenType)); + + // Step into the first key + reader.Read(); + + while (reader.TokenType != JsonToken.EndObject) + { + TKey key = (TKey)Convert.ChangeType(reader.Value, typeof(TKey)); + + // Step into the value + reader.Read(); + + TValue value = extends.Deserialize(reader); + + yield return new KeyValuePair(key, value); + } + } } }