<PackageReference Include="Newtonsoft.Json" Version="10.0.1" />

ExpandoObjectConverter

Converts an ExpandoObject to and from JSON.
using Newtonsoft.Json.Utilities; using System; using System.Collections.Generic; using System.Dynamic; using System.Globalization; namespace Newtonsoft.Json.Converters { public class ExpandoObjectConverter : JsonConverter { public override bool CanWrite => false; public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return ReadValue(reader); } private object ReadValue(JsonReader reader) { if (reader.MoveToContent()) { switch (reader.TokenType) { case JsonToken.StartObject: return ReadObject(reader); case JsonToken.StartArray: return ReadList(reader); default: if (JsonTokenUtils.IsPrimitiveToken(reader.TokenType)) return reader.Value; throw JsonSerializationException.Create(reader, "Unexpected token when converting ExpandoObject: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } } throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); } private object ReadList(JsonReader reader) { IList<object> list = new List<object>(); while (reader.Read()) { switch (reader.TokenType) { default: { object item = ReadValue(reader); list.Add(item); break; } case JsonToken.EndArray: return list; case JsonToken.Comment: break; } } throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); } private object ReadObject(JsonReader reader) { IDictionary<string, object> dictionary = new ExpandoObject(); while (reader.Read()) { switch (reader.TokenType) { case JsonToken.PropertyName: { string key = reader.Value.ToString(); if (!reader.Read()) throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); object obj2 = dictionary[key] = ReadValue(reader); break; } case JsonToken.EndObject: return dictionary; } } throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); } public override bool CanConvert(Type objectType) { return objectType == typeof(ExpandoObject); } } }