using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class Test : IEnumerable<IItem>
[JsonProperty(ItemConverterType = typeof(TestItemJsonConverter))]
protected List<IItem> _items;
public Test(IEnumerable<IItem> o)
_items = o == null ? new List<IItem>() : new List<IItem>(o);
public decimal Total { get; set; }
IEnumerator IEnumerable.GetEnumerator()
return _items.GetEnumerator();
IEnumerator<IItem> IEnumerable<IItem>.GetEnumerator()
return _items.GetEnumerator();
public class Item1 : IItem
public Item1(decimal fee) { Fee = fee; }
public string ItemName { get { return "Item1"; } }
public virtual decimal Fee { get; set; }
public class TestItemJsonConverter : JsonConverter
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
var old = reader.FloatParseHandling;
reader.FloatParseHandling = FloatParseHandling.Decimal;
JObject jObj = JObject.Load(reader);
string itemTypeID = jObj["ItemName"].Value<string>();
if (itemTypeID == "Item1")
result = jObj.ToObject(typeof(Item1), serializer);
reader.FloatParseHandling = old;
public override bool CanConvert(Type objectType) { return (objectType == typeof(IItem)); }
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); }
public static void Test()
Test test1 = new Test(new List<Item1> { new Item1(9.00m), new Item1(24.0000m) })
string json = JsonConvert.SerializeObject(test1, Formatting.Indented);
Test test1Clone = JsonConvert.DeserializeObject<Test>(json);
string json2 = JsonConvert.SerializeObject(test1Clone, Formatting.Indented);
Console.WriteLine(json2);
Assert.IsTrue(json2 == json);
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");