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