public DeserializerLazyDictionary(JsonReader reader, JsonSerializer serializer) { _reader = reader; _serializer = serializer; }
private IEnumerator<KeyValuePair<string, object>> PopulateObject(JsonReader reader/*, Type objectType*/) { reader.IncrementRecursionLevel (); while (reader.Read ()) { switch (reader.TokenType) { case JsonToken.PropertyName: string memberName = reader.Value.ToString (); if (!reader.Read ()) throw new JsonSerializationException (string.Format ("Unexpected end when setting {0}'s value.", memberName)); yield return new KeyValuePair<string, object> (memberName, GetObject (reader)); break; case JsonToken.EndObject: reader.DecrementRecursionLevel (); yield break; default: throw new JsonSerializationException ("Unexpected token when deserializing object: " + reader.TokenType); } } throw new JsonSerializationException ("Unexpected end when deserializing object."); }
private object GetObject(JsonReader reader/*, Type objectType*/) { if (RecursionLimit > 0 && reader.CurrentRecursionLevel >= RecursionLimit) { throw new ArgumentException ("RecursionLimit exceeded."); } object value; switch (reader.TokenType) { // populate a typed object or generic dictionary/array // depending upon whether an objectType was supplied case JsonToken.StartObject: //value = PopulateObject(reader/*, objectType*/); value = new DeserializerLazyDictionary (reader, this); break; case JsonToken.StartArray: value = PopulateList (reader/*, objectType*/); break; case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Date: //value = EnsureType(reader.Value, objectType); value = reader.Value; break; case JsonToken.Constructor: value = reader.Value.ToString (); break; case JsonToken.Null: case JsonToken.Undefined: value = null; break; default: throw new JsonSerializationException ("Unexpected token whil deserializing object: " + reader.TokenType); } return value; }
private IEnumerable<object> PopulateList(JsonReader reader/*, Type objectType*/) { while (reader.Read()) { switch (reader.TokenType) { case JsonToken.EndArray: yield break; case JsonToken.Comment: break; default: yield return GetObject (reader/*, elementType*/); break; } } throw new JsonSerializationException ("Unexpected end when deserializing array."); }
/// <summary> /// Deserializes the Json structure contained by the specified <see cref="JsonReader"/> /// into an instance of the specified type. /// </summary> /// <param name="reader">The type of object to create.</param> /// <param name="objectType">The <see cref="Type"/> of object being deserialized.</param> /// <returns>The instance of <paramref name="objectType"/> being deserialized.</returns> object Deserialize(JsonReader reader) { if (!reader.Read ()) return null; return GetObject (reader); }