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