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);
        }