private object ReadObject(JsonReader reader)
        {
            dynamic expandoObject = new System.Dynamic.ExpandoObject2();

            while (reader.Read())
            {
                switch (reader.TokenType)
                {
                case JsonToken.PropertyName:
                    string propertyName = reader.Value.ToString();

                    if (!reader.Read())
                    {
                        throw JsonSerializationException2.Create(reader, "Unexpected end when reading ExpandoObject2.");
                    }

                    object v = ReadValue(reader);

                    expandoObject[propertyName] = v;
                    break;

                case JsonToken.Comment:
                    break;

                case JsonToken.EndObject:
                    return(expandoObject);
                }
            }
            throw JsonSerializationException2.Create(reader, "Unexpected end when reading ExpandoObject2.");
        }
        private object ReadList(JsonReader reader)
        {
            IList <object> list = new List <object>();

            while (reader.Read())
            {
                switch (reader.TokenType)
                {
                case JsonToken.Comment:
                    break;

                default:
                    object v = ReadValue(reader);
                    list.Add(v);
                    break;

                case JsonToken.EndArray:
                {
                    //return list;
                    var types = list.Select(f => f.GetType()).Distinct().ToArray();
                    if (types.Length == 1)
                    {
                        var type         = types.Single();
                        var ofTypeMethod = typeof(ExpandoObject2Converter).GetMethod(nameof(ExpandoObject2Converter.objectToT), BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(type);
                        var value        = ofTypeMethod.Invoke(this, new object[] { list });
                        return(value);
                        //return objectToT<string>(list);
                    }
                    else
                    {
                        return(list.ToArray());
                    }
                }
                }
            }

            throw JsonSerializationException2.Create(reader, "Unexpected end when reading ExpandoObject2.");
        }
        private object ReadValue(JsonReader reader)
        {
            if (!reader.MoveToContent())
            {
                throw JsonSerializationException2.Create(reader, "Unexpected end when reading ExpandoObject2.");
            }

            switch (reader.TokenType)
            {
            case JsonToken.StartObject:
                return(ReadObject(reader));

            case JsonToken.StartArray:
                return(ReadList(reader));

            default:
                if (IsPrimitiveToken(reader.TokenType))
                {
                    return(reader.Value);
                }

                throw JsonSerializationException2.Create(reader, "Unexpected token when converting ExpandoObject2: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType));
            }
        }