private object DeserializeMembers(IJsonReader reader, Dictionary <string, object> container,
                                          ref ObjectSerializer serializerOverride)
        {
            while (reader.NextToken() && reader.Token != JsonToken.EndOfObject)
            {
                if (reader.Token != JsonToken.Member)
                {
                    throw new UnexpectedToken(reader, JsonToken.Member);
                }

                string memberName = null;
                object value      = null;

                memberName = reader.Value.AsString;                 // string
                if (string.Equals(memberName, TYPE_MEMBER_NAME) && this.SuppressTypeInformation == false)
                {
                    reader.NextToken();
                    var typeName   = reader.ReadString(false);
                    var type       = reader.Context.GetType(typeName, true, true);
                    var serializer = reader.Context.GetSerializerForType(type);
                    if (serializer is ObjectSerializer)
                    {
                        serializerOverride = (ObjectSerializer)serializer;
                        serializerOverride.DeserializeMembers(reader, container, ref serializerOverride);
                        return(null);
                    }
                    else
                    {
                        reader.NextToken();                         // advance to next member
                        serializerOverride = null;
                        return(serializer.Deserialize(reader));
                    }
                }

                var member    = default(DataMemberDescription);
                var valueType = typeof(object);

                if (this.TryGetMember(memberName, out member))
                {
                    valueType = member.ValueType;
                }

                reader.NextToken();

                try
                {
                    value = reader.ReadValue(valueType, false);
                }
                catch (Exception e)
                {
                    throw new SerializationException(string.Format("Failed to read value for member '{0}' of '{1}' type.\r\nMore detailed information in inner exception.", memberName, this.objectType.Name), e);
                }

                container[memberName] = value;
            }

            return(null);
        }
Beispiel #2
0
        public static DateTime ReadDateTime(this IJsonReader reader, bool nextToken = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }


            var value = default(DateTime);

            if (reader.Token == JsonToken.Member || reader.Token == JsonToken.StringLiteral || reader.Token == JsonToken.Number || reader.Token == JsonToken.DateTime)
            {
                value = reader.Value.AsDateTime;
            }
            else
            {
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Number, JsonToken.DateTime);
            }

            if (nextToken)
            {
                reader.NextToken();
            }

            return(value);
        }
Beispiel #3
0
        public static DateTime ReadDateTime(this IJsonReader reader, bool advance = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }


            var value = default(DateTime);

            if (reader.Token == JsonToken.StringLiteral || reader.Token == JsonToken.Number || reader.Token == JsonToken.DateTime)
            {
                value = reader.Value.AsDateTime;
            }
            else
            {
                throw new UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Number, JsonToken.DateTime);
            }

            if (!reader.IsEndOfStream() && advance)
            {
                reader.NextToken();
            }

            return(value);
        }
Beispiel #4
0
        public static DateTime?ReadDateTimeOrNull(this IJsonReader reader, bool nextToken = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }


            var value = default(DateTime?);

            switch (reader.Token)
            {
            case JsonToken.Null:
                value = null;
                break;

            case JsonToken.Member:
            case JsonToken.StringLiteral:
            case JsonToken.Number:
            case JsonToken.DateTime:
                value = reader.Value.AsDateTime;
                break;

            default:
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Number, JsonToken.DateTime);
            }

            if (nextToken)
            {
                reader.NextToken();
            }

            return(value);
        }
Beispiel #5
0
        public static bool?ReadBooleanOrNull(this IJsonReader reader, bool advance = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }


            var value = default(bool?);

            switch (reader.Token)
            {
            case JsonToken.Null:
                value = null;
                break;

            case JsonToken.StringLiteral:
            case JsonToken.Boolean:
                value = reader.Value.AsBoolean;
                break;

            default:
                throw new UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Boolean);
            }

            if (!reader.IsEndOfStream() && advance)
            {
                reader.NextToken();
            }

            return(value);
        }
Beispiel #6
0
        public static bool ReadBoolean(this IJsonReader reader, bool advance = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }


            var value = default(bool);

            if (reader.Token == JsonToken.StringLiteral || reader.Token == JsonToken.Boolean)
            {
                value = reader.Value.AsBoolean;
            }
            else
            {
                throw new UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Boolean);
            }

            if (!reader.IsEndOfStream() && advance)
            {
                reader.NextToken();
            }

            return(value);
        }
Beispiel #7
0
        public static string ReadString(this IJsonReader reader, bool nextToken = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            var stringValue = default(string);

            switch (reader.Token)
            {
            case JsonToken.Null:
                break;

            case JsonToken.Member:
            case JsonToken.StringLiteral:
            case JsonToken.Number:
            case JsonToken.DateTime:
            case JsonToken.Boolean:
                stringValue = Convert.ToString(reader.RawValue, reader.Context.Format);
                break;

            default:
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.StringLiteral, JsonToken.Number, JsonToken.DateTime, JsonToken.Boolean);
            }

            if (nextToken)
            {
                reader.NextToken();
            }

            return(stringValue);
        }
Beispiel #8
0
        /// <summary>
        /// Read a literal number
        /// </summary>
        /// <param name="reader">The reader to read from</param>
        /// <param name="type">The number type to return</param>
        /// <returns>A number of specified type, or throws an InvalidDataException</returns>
        public static object ReadLiteralNumber(this IJsonReader reader, Type type)
        {
            switch (reader.GetLiteralKind())
            {
            case LiteralKind.String:
                var value = Convert.ChangeType(reader.GetLiteralString(), type, CultureInfo.InvariantCulture);
                reader.NextToken();
                return(value);

            case LiteralKind.SignedInteger:
            case LiteralKind.UnsignedInteger:
            {
                var str = reader.GetLiteralString();
                if (str.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase))
                {
                    var    tempValue = Convert.ToUInt64(str.Substring(2), 16);
                    object val       = Convert.ChangeType(tempValue, type, CultureInfo.InvariantCulture);
                    reader.NextToken();
                    return(val);
                }
                else
                {
                    object val = Convert.ChangeType(str, type, CultureInfo.InvariantCulture);
                    reader.NextToken();
                    return(val);
                }
            }

            case LiteralKind.FloatingPoint:
            {
                object val = Convert.ChangeType(reader.GetLiteralString(), type, CultureInfo.InvariantCulture);
                reader.NextToken();
                return(val);
            }
            }
            throw new InvalidDataException("expected a numeric literal");
        }
Beispiel #9
0
        private void SkipObject(IJsonReader reader)
        {
            reader.ReadObjectBegin();
            int objectBegins = 1;

            while (objectBegins > 0)
            {
                switch (reader.Token)
                {
                case JsonToken.BeginObject: objectBegins++; break;

                case JsonToken.EndOfObject: objectBegins--; break;
                }
                reader.NextToken();
            }
        }
Beispiel #10
0
        public static object ReadValue(this IJsonReader reader, Type valueType, bool advance = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            // try guess type
            if (valueType == typeof(object) && reader.Token != JsonToken.BeginObject)
            {
                valueType = reader.Value.ProbableType;
            }

            if (valueType != null && valueType.IsInstantiationOf(typeof(Nullable <>)))
            {
                if (reader.Token == JsonToken.Null)
                {
                    return(null);
                }

                valueType = valueType.GetGenericArguments()[0];
            }

            if (valueType == null)
            {
                valueType = typeof(object);
            }

            if (reader.Token == JsonToken.Null)
            {
                if (valueType.IsValueType)
                {
                    reader.ThrowUnexpectedToken(JsonToken.BeginArray, JsonToken.BeginObject, JsonToken.StringLiteral, JsonToken.Number, JsonToken.Boolean, JsonToken.DateTime);
                }
                return(null);
            }

            var serializer = reader.Context.GetSerializerForType(valueType);
            var value      = serializer.Deserialize(reader);

            if (!reader.IsEndOfStream() && advance)
            {
                reader.NextToken();
            }

            return(value);
        }
Beispiel #11
0
        public static void ReadNull(this IJsonReader reader, bool advance = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            if (reader.Token != JsonToken.Null)
            {
                throw new UnexpectedToken(reader, JsonToken.Null);
            }

            if (!reader.IsEndOfStream() && advance)
            {
                reader.NextToken();
            }
        }
Beispiel #12
0
        public static void ReadNull(this IJsonReader reader, bool nextToken = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            if (reader.Token != JsonToken.Null)
            {
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.Null);
            }

            if (nextToken)
            {
                reader.NextToken();
            }
        }
Beispiel #13
0
        public override object Deserialize(IJsonReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            if (reader.Token == JsonToken.Null)
            {
                return(null);
            }

            var container = new ArrayList();

            if (reader.Token != JsonToken.BeginArray)
            {
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.BeginArray);
            }

            reader.Context.Hierarchy.Push(container);
            while (reader.NextToken() && reader.Token != JsonToken.EndOfArray)
            {
                var value = reader.ReadValue(this.elementType, false);
                container.Add(value);
            }
            reader.Context.Hierarchy.Pop();

            if (reader.IsEndOfStream())
            {
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.EndOfArray);
            }

            if (this.instantiatedArrayType == typeof(ArrayList))
            {
                return(container);
            }
            else if (this.instantiatedArrayType.IsArray)
            {
                return(container.ToArray(this.elementType));
            }
            else
            {
                return(Activator.CreateInstance(this.instantiatedArrayType, container.ToArray(this.elementType)));
            }
        }
Beispiel #14
0
 private static PointComplex ParseJson(IJsonReader r)
 {
     if (r.GetLiteralKind() == LiteralKind.String)
     {
         var parts = ((string)r.GetLiteralString()).Split(',');
         if (parts.Length == 2)
         {
             var pt = new PointComplex()
             {
                 X = int.Parse(parts[0], CultureInfo.InvariantCulture),
                 Y = int.Parse(parts[1], CultureInfo.InvariantCulture),
             };
             r.NextToken();
             return(pt);
         }
     }
     throw new InvalidDataException("Invalid point");
 }
Beispiel #15
0
 private static PointComplex ParseJson(IJsonReader r)
 {
     if (r.GetLiteralKind() == LiteralKind.String)
     {
         var parts = ((string)r.GetLiteralString()).Split(',');
         if (parts.Length == 2)
         {
             var pt = new PointComplex()
             {
                 X = int.Parse(parts[0], CultureInfo.InvariantCulture),
                 Y = int.Parse(parts[0], CultureInfo.InvariantCulture),
             };
             r.NextToken();
             return pt;
         }
     }
     throw new InvalidDataException("Invalid point");
 }
Beispiel #16
0
        public static string DebugPrintTokens(this IJsonReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            var output = new StringBuilder();
            var stack  = new Stack <JsonToken>();

            stack.Push(JsonToken.None);
            while (reader.NextToken())
            {
                var strValue = reader.Token + (reader.Value.HasValue && reader.Value != null ? "[<" + reader.Value.Type.Name + "> " + JsonUtils.EscapeAndQuote(reader.Value.AsString).Trim('"') + "]" : "");

                if (stack.Peek() != JsonToken.Member)
                {
                    var endingTokenIndent = (reader.Token == JsonToken.EndOfObject || reader.Token == JsonToken.EndOfArray ? -1 : 0);
                    output.Append(Environment.NewLine);
                    for (var i = 0; i < System.Linq.Enumerable.Count(stack, t => t != JsonToken.Member && t != JsonToken.None) + endingTokenIndent; i++)
                    {
                        output.Append("\t");
                    }
                }
                else
                {
                    output.Append(" ");
                }

                output.Append(strValue);

                if (reader.Token == JsonToken.EndOfObject || reader.Token == JsonToken.EndOfArray || stack.Peek() == JsonToken.Member)
                {
                    stack.Pop();
                }
                if (reader.Token == JsonToken.BeginObject || reader.Token == JsonToken.BeginArray || reader.Token == JsonToken.Member)
                {
                    stack.Push(reader.Token);
                }
            }
            return(output.ToString());
        }
Beispiel #17
0
        private void SkipArray(IJsonReader reader, bool alreadyStarted)
        {
            if (!alreadyStarted)
            {
                reader.ReadArrayBegin();
            }

            int arrayBegins = 1;

            while (arrayBegins > 0)
            {
                switch (reader.Token)
                {
                case JsonToken.BeginArray: arrayBegins++; break;

                case JsonToken.EndOfArray: arrayBegins--; break;
                }
                reader.NextToken();
            }
        }
Beispiel #18
0
        public static void ReadArrayBegin(this IJsonReader reader, bool advance = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }


            if (reader.Token != JsonToken.BeginArray)
            {
                throw new UnexpectedToken(reader, JsonToken.BeginArray);
            }
            if (reader.IsEndOfStream())
            {
                throw new UnexpectedToken(reader, JsonToken.EndOfArray);
            }

            if (advance)
            {
                reader.NextToken();
            }
        }
Beispiel #19
0
        public static void ReadObjectBegin(this IJsonReader reader, bool nextToken = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }


            if (reader.Token != JsonToken.BeginObject)
            {
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.BeginObject);
            }
            if (reader.IsEndOfStream())
            {
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.EndOfObject);
            }

            if (nextToken)
            {
                reader.NextToken();
            }
        }
Beispiel #20
0
        public static string ReadMember(this IJsonReader reader, bool nextToken = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }


            if (reader.Token != JsonToken.Member)
            {
                throw JsonSerializationException.UnexpectedToken(reader, JsonToken.Member);
            }

            var memberName = (string)reader.RawValue;

            if (nextToken)
            {
                reader.NextToken();
            }

            return(memberName);
        }
Beispiel #21
0
        public static string ReadMember(this IJsonReader reader, bool advance = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }


            if (reader.Token != JsonToken.Member)
            {
                throw new UnexpectedToken(reader, JsonToken.Member);
            }

            var memberName = (string)reader.RawValue;

            if (!reader.IsEndOfStream() && advance)
            {
                reader.NextToken();
            }

            return(memberName);
        }
Beispiel #22
0
        public static object ReadValue(this IJsonReader reader, Type valueType, bool nextToken = true)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            // try guess type
            if (valueType == typeof(object))
            {
                valueType = reader.Value.Type;
            }

            var value      = default(object);
            var isNullable = valueType.IsValueType == false || valueType.IsInstantiationOf(typeof(Nullable <>));

            if (reader.Token == JsonToken.Null && isNullable)
            {
                value = null;
            }
            else
            {
                if (isNullable && valueType.IsValueType)
                {
                    valueType = valueType.GetGenericArguments()[0];                     // get subtype of Nullable<T>
                }
                var serializer = reader.Context.GetSerializerForType(valueType);
                value = serializer.Deserialize(reader);
            }

            if (nextToken)
            {
                reader.NextToken();
            }

            return(value);
        }
        public override object Deserialize(IJsonReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            var container = new List <DictionaryEntry>();

            reader.Context.Hierarchy.Push(container);
            try
            {
                if (reader.Token == JsonToken.BeginArray)
                {
                    while (reader.NextToken() && reader.Token != JsonToken.EndOfArray)
                    {
                        if (reader.Token != JsonToken.BeginArray || !reader.NextToken())
                        {
                            throw new UnexpectedToken(reader, JsonToken.BeginArray);
                        }

                        object key   = null;
                        object value = null;

                        try
                        {
                            key = reader.ReadValue(keyType, false);
                        }
                        catch (Exception e)
                        {
                            throw new SerializationException(string.Format("Failed to read '{0}' key of dictionary: {1}\r\nMore detailed information in inner exception.", keyType.Name, e.Message), e);
                        }

                        if (!reader.NextToken())
                        {
                            throw new UnexpectedToken(reader, JsonToken.Boolean, JsonToken.DateTime, JsonToken.Number,
                                                      JsonToken.StringLiteral);
                        }

                        try
                        {
                            value = reader.ReadValue(valueType, false);
                        }
                        catch (Exception e)
                        {
                            throw new SerializationException(string.Format("Failed to read '{0}' value for key '{1}' in dictionary: {2}\r\nMore detailed information in inner exception.", valueType.Name, key, e.Message), e);
                        }


                        container.Add(new DictionaryEntry(key, value));

                        if (!reader.NextToken() || reader.Token != JsonToken.EndOfArray)
                        {
                            throw new UnexpectedToken(reader, JsonToken.EndOfArray);
                        }
                    }
                }
                else if (reader.Token == JsonToken.BeginObject)
                {
                    while (reader.NextToken() && reader.Token != JsonToken.EndOfObject)
                    {
                        if (reader.Token != JsonToken.Member)
                        {
                            throw new UnexpectedToken(reader, JsonToken.Member);
                        }

                        string key   = null;
                        object value = null;

                        try
                        {
                            key = reader.Value.AsString;
                        }
                        catch (Exception e)
                        {
                            throw new SerializationException(string.Format("Failed to read '{0}' key of dictionary: {1}\r\nMore detailed information in inner exception.", keyType.Name, e.Message), e);
                        }

                        if (!reader.NextToken())
                        {
                            throw new UnexpectedToken(reader, JsonToken.Boolean, JsonToken.DateTime, JsonToken.Number,
                                                      JsonToken.StringLiteral);
                        }
                        try
                        {
                            value = reader.ReadValue(valueType, false);
                        }
                        catch (Exception e)
                        {
                            throw new SerializationException(string.Format("Failed to read '{0}' value for key '{1}' in dictionary: {2}\r\nMore detailed information in inner exception.", valueType.Name, key, e.Message), e);
                        }


                        container.Add(new DictionaryEntry(key, value));
                    }
                }
                else
                {
                    throw new UnexpectedToken(reader, JsonToken.BeginObject, JsonToken.BeginArray);
                }

                var dictionary = (IDictionary)Activator.CreateInstance(this.dictionaryType);
                foreach (var kv in container)
                {
                    var key   = kv.Key;
                    var value = kv.Value;

                    if (this.keyType.IsEnum)
                    {
                        key = Enum.Parse(this.keyType, Convert.ToString(key));
                    }
                    else if (this.keyType != typeof(string) && this.keyType != typeof(object))
                    {
                        key = Convert.ChangeType(key, this.keyType);
                    }

                    if (dictionary.Contains(key))
                    {
                        dictionary.Remove(key);
                    }

                    dictionary.Add(key, value);
                }

                return(dictionary);
            }
            finally
            {
                reader.Context.Hierarchy.Pop();
            }
        }
Beispiel #24
0
        private static void CopyValue(IJsonReader reader, StringBuilder buffer)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            switch (reader.Token)
            {
            case JsonToken.None:
            case JsonToken.EndOfStream:
                throw new UnexpectedEndOfStream(reader);

            case JsonToken.DateTime:
            case JsonToken.EndOfArray:
            case JsonToken.EndOfObject:
            case JsonToken.Number:
            case JsonToken.Member:
            case JsonToken.Boolean:
            case JsonToken.StringLiteral:
            case JsonToken.Null:
                if (buffer != null)
                {
                    reader.Value.CopyJsonTo(buffer);
                }
                break;

            case JsonToken.BeginArray:

                // copy BeginArray token
                if (buffer != null)
                {
                    reader.Value.CopyJsonTo(buffer);
                }

                reader.NextToken();                         // advance

                // iterate values
                while (reader.Token != JsonToken.EndOfArray)
                {
                    // copy Value
                    CopyValue(reader, buffer);
                    reader.NextToken();

                    if (reader.Token != JsonToken.EndOfArray)
                    {
                        buffer.Append(',');
                    }
                }

                // copy EndOfArray token
                if (buffer != null)
                {
                    reader.Value.CopyJsonTo(buffer);
                }
                break;

            case JsonToken.BeginObject:
                // copy BeginObject token
                if (buffer != null)
                {
                    reader.Value.CopyJsonTo(buffer);
                }

                reader.NextToken();                         // advance

                // iterate values
                while (reader.Token != JsonToken.EndOfObject)
                {
                    // copy MemberName token
                    if (buffer != null)
                    {
                        reader.Value.CopyJsonTo(buffer);
                    }
                    reader.NextToken();
                    if (buffer != null)
                    {
                        buffer.Append(':');
                    }
                    // copy Value
                    CopyValue(reader, buffer);
                    reader.NextToken();

                    if (reader.Token != JsonToken.EndOfObject)
                    {
                        buffer.Append(',');
                    }
                }

                // copy EndOfObject token
                if (buffer != null)
                {
                    reader.Value.CopyJsonTo(buffer);
                }
                break;
            }
        }