using System.Collections.Generic;
using Newtonsoft.Json.Serialization;
public static void Main()
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new NullToEmptyListResolver();
settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
settings.Formatting = Formatting.Indented;
Console.WriteLine("Serializing object with null lists...");
string json = JsonConvert.SerializeObject(foo, settings);
Console.WriteLine("Deserializing back to objects...");
foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Console.WriteLine("IntList size: " + foo.IntList.Count);
Console.WriteLine("StringList size: " + foo.StringList.Count);
Console.WriteLine("Deserializing JSON with null lists...");
json = @"{ ""IntList"" : null, ""StringList"" : null }";
foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Console.WriteLine("IntList size: " + foo.IntList.Count);
Console.WriteLine("StringList size: " + foo.StringList.Count);
Console.WriteLine("Serializing back to JSON...");
json = JsonConvert.SerializeObject(foo, settings);
Console.WriteLine("Serializing object with non-empty lists...");
IntList = new List<int> { 1, 2, 3 },
StringList = new List<string> { "a", "b", "c" }
json = JsonConvert.SerializeObject(foo, settings);
Console.WriteLine("Deserializing back to objects...");
foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Console.WriteLine("IntList: " + string.Join(", ", foo.IntList.Select(i => i.ToString())));
Console.WriteLine("StringList: " + string.Join(", ", foo.StringList.Select(s => s)));
public List<int> IntList { get; set; }
public List<string> StringList { get; set; }
class NullToEmptyListResolver : DefaultContractResolver
protected override IValueProvider CreateMemberValueProvider(MemberInfo member)
IValueProvider provider = base.CreateMemberValueProvider(member);
if (member.MemberType == MemberTypes.Property)
Type propType = ((PropertyInfo)member).PropertyType;
if (propType.IsGenericType &&
propType.GetGenericTypeDefinition() == typeof(List<>))
return new EmptyListValueProvider(provider, propType);
class EmptyListValueProvider : IValueProvider
private IValueProvider innerProvider;
private object defaultValue;
public EmptyListValueProvider(IValueProvider innerProvider, Type listType)
this.innerProvider = innerProvider;
defaultValue = Activator.CreateInstance(listType);
public void SetValue(object target, object value)
innerProvider.SetValue(target, value ?? defaultValue);
public object GetValue(object target)
return innerProvider.GetValue(target) ?? defaultValue;