internal static GenericDataObject JTokenToGenericData(JToken token)
        {
            switch (token.Type)
            {
            case JTokenType.Object:
                var jobject = (IEnumerable <KeyValuePair <string, JToken> >)token;
                return(GenericDataMap.Create(jobject.ToDictionary(field => field.Key, field => JTokenToGenericData(field.Value))));

            case JTokenType.Array:
                return(GenericDataList.Create(((JArray)token).Select(item => JTokenToGenericData(item))));

            case JTokenType.Integer:
                return(GenericDataNumber.Create((long)token));

            case JTokenType.Float:
                return(GenericDataNumber.Create((double)token));

            case JTokenType.String:
                return(GenericDataString.Create((string)token));

            case JTokenType.Boolean:
                return(GenericDataBool.Create((bool)token));

            case JTokenType.Null:
                return(null);

            // Currently unsupported types.
            case JTokenType.None:
            case JTokenType.Constructor:
            case JTokenType.Property:
            case JTokenType.Comment:
            case JTokenType.Undefined:
            case JTokenType.Date:
            case JTokenType.Raw:
            case JTokenType.Bytes:
            case JTokenType.Guid:
            case JTokenType.Uri:
            case JTokenType.TimeSpan:
                throw new InvalidOperationException($"Unsupported JSON token type: {token.Type}");

            default:
                throw new InvalidOperationException("Unreachable code executed.");
            }
        }
            internal GenericDataObject ToGenericDataObject()
            {
                switch (Kind)
                {
                case JsonValueKind.Object:

                    var obj  = AsObject().Value;
                    var dict = new Dictionary <string, GenericDataObject>();
                    foreach (var property in obj)
                    {
                        dict.Add(property.Key, property.Value.ToGenericDataObject());
                    }

                    return(GenericDataMap.Create(dict));

                case JsonValueKind.Array:
                    return(GenericDataList.Create(AsArray().Value.Select <GenericDataObject>(elem => elem.ToGenericDataObject())));

                case JsonValueKind.String:
                    return(GenericDataString.Create(AsString()));

                case JsonValueKind.Number:
                    return(GenericDataNumber.Create(AsDouble().Value));

                case JsonValueKind.True:
                    return(GenericDataBool.True);

                case JsonValueKind.False:
                    return(GenericDataBool.False);

                case JsonValueKind.Null:
                    return(null);

                default:
                    throw Exceptions.Unreachable;
                }
            }