diff --git a/ICD.Common.Utils/Extensions/JsonExtensions.cs b/ICD.Common.Utils/Extensions/JsonExtensions.cs index ed5338c..be15396 100644 --- a/ICD.Common.Utils/Extensions/JsonExtensions.cs +++ b/ICD.Common.Utils/Extensions/JsonExtensions.cs @@ -58,6 +58,21 @@ namespace ICD.Common.Utils.Extensions extends.WriteValue(name); } + /// + /// Gets the current value as a Type. + /// + /// + /// + [PublicAPI] + public static Type GetValueAsType(this JsonReader extends) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + string value = extends.GetValueAsString(); + return Type.GetType(value, false, true); + } + /// /// Gets the current value as an integer. /// @@ -146,10 +161,36 @@ namespace ICD.Common.Utils.Extensions if (items == null) throw new ArgumentNullException("items"); + extends.SerializeArray(writer, items, (s, w, item) => s.Serialize(w, item)); + } + + /// + /// Serializes the given sequence of items to the writer. + /// + /// + /// + /// + /// + /// + public static void SerializeArray(this JsonSerializer extends, JsonWriter writer, IEnumerable items, + Action write) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (writer == null) + throw new ArgumentNullException("writer"); + + if (items == null) + throw new ArgumentNullException("items"); + + if (write == null) + throw new ArgumentNullException("write"); + writer.WriteStartArray(); { foreach (TItem item in items) - extends.Serialize(writer, item); + write(extends, writer, item); } writer.WriteEndArray(); } @@ -168,6 +209,28 @@ namespace ICD.Common.Utils.Extensions if (reader == null) throw new ArgumentNullException("reader"); + return extends.DeserializeArray(reader, (s, r) => extends.Deserialize(reader)); + } + + /// + /// Deserializes an array of items from the reader's current value. + /// + /// + /// + /// + /// + public static IEnumerable DeserializeArray(this JsonSerializer extends, JsonReader reader, + Func read) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (reader == null) + throw new ArgumentNullException("reader"); + + if (read == null) + throw new ArgumentNullException("read"); + if (reader.TokenType == JsonToken.Null) yield break; @@ -179,7 +242,7 @@ namespace ICD.Common.Utils.Extensions while (reader.TokenType != JsonToken.EndArray) { - TItem output = extends.Deserialize(reader); + TItem output = read(extends, reader); yield return output; // Read out of the last value