From 909ebfbc97d05eec3466314c7c6ef51a01736a42 Mon Sep 17 00:00:00 2001 From: Chris Cameron Date: Mon, 1 Jul 2019 17:07:50 -0400 Subject: [PATCH] fix: Throwing an exception when trying to read non-primitive JSON tokens as string --- .../Extensions/JsonReaderExtensions.cs | 3 ++ .../Extensions/JsonTokenExtensions.cs | 45 +++++++++++++++++++ .../ICD.Common.Utils_SimplSharp.csproj | 1 + 3 files changed, 49 insertions(+) create mode 100644 ICD.Common.Utils/Extensions/JsonTokenExtensions.cs diff --git a/ICD.Common.Utils/Extensions/JsonReaderExtensions.cs b/ICD.Common.Utils/Extensions/JsonReaderExtensions.cs index e50a120..1a5f128 100644 --- a/ICD.Common.Utils/Extensions/JsonReaderExtensions.cs +++ b/ICD.Common.Utils/Extensions/JsonReaderExtensions.cs @@ -146,6 +146,9 @@ namespace ICD.Common.Utils.Extensions if (extends == null) throw new ArgumentNullException("extends"); + if (!extends.TokenType.IsPrimitive()) + throw new FormatException("Expected primitive token type but got " + extends.TokenType); + return extends.Value == null ? null : extends.Value.ToString(); } diff --git a/ICD.Common.Utils/Extensions/JsonTokenExtensions.cs b/ICD.Common.Utils/Extensions/JsonTokenExtensions.cs new file mode 100644 index 0000000..a2ab88f --- /dev/null +++ b/ICD.Common.Utils/Extensions/JsonTokenExtensions.cs @@ -0,0 +1,45 @@ +using System; +using Newtonsoft.Json; + +namespace ICD.Common.Utils.Extensions +{ + public static class JsonTokenExtensions + { + /// + /// Returns true if the JsonToken respresents a single data value + /// rather than a complex type such as an object or an array. + /// + /// + /// + public static bool IsPrimitive(this JsonToken extends) + { + switch (extends) + { + case JsonToken.None: + case JsonToken.StartObject: + case JsonToken.StartArray: + case JsonToken.StartConstructor: + case JsonToken.EndObject: + case JsonToken.EndArray: + case JsonToken.EndConstructor: + case JsonToken.Undefined: + return false; + + case JsonToken.PropertyName: + case JsonToken.Comment: + case JsonToken.Raw: + case JsonToken.Integer: + case JsonToken.Float: + case JsonToken.String: + case JsonToken.Boolean: + case JsonToken.Null: + case JsonToken.Date: + case JsonToken.Bytes: + return true; + + default: + throw new ArgumentOutOfRangeException("extends"); + } + } + } +} \ No newline at end of file diff --git a/ICD.Common.Utils/ICD.Common.Utils_SimplSharp.csproj b/ICD.Common.Utils/ICD.Common.Utils_SimplSharp.csproj index 7939358..1ba061a 100644 --- a/ICD.Common.Utils/ICD.Common.Utils_SimplSharp.csproj +++ b/ICD.Common.Utils/ICD.Common.Utils_SimplSharp.csproj @@ -110,6 +110,7 @@ +