using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class JsonSelectiveSerializeContractResolver : DefaultContractResolver
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
var property = base.CreateProperty(member, memberSerialization);
var shouldSerialize = property.ShouldSerialize;
var name = property.PropertyName;
property.ShouldSerialize = (o) =>
var selectiveSerialize = o as ISelectiveJsonSerialize;
if (selectiveSerialize != null)
if (!selectiveSerialize.PropertiesToSerialize.Contains(name))
return shouldSerialize == null || shouldSerialize(o);
public interface ISelectiveJsonSerialize
IList<string> PropertiesToSerialize { get; }
void ClearPropertiesToSerialize();
public class BaseType : ISelectiveJsonSerialize
public static event EventHandler Serialized;
void OnSerialized(StreamingContext ctx)
var serialized = Serialized;
Serialized(this, EventArgs.Empty);
readonly List<string> propertiesToSerialize = new List<string>();
#region ISelectiveJsonSerialize Members
public IList<string> PropertiesToSerialize { get { return propertiesToSerialize; } }
public void ClearPropertiesToSerialize()
propertiesToSerialize.Clear();
public class Category : BaseType
PropertiesToSerialize.Add("Name");
private Category _subcategory;
public Category SubCategory
get { return _subcategory; }
PropertiesToSerialize.Add("SubCategory");
internal static void Test()
BaseType.Serialized += (sender, e) =>
var selectiveSerialized = sender as ISelectiveJsonSerialize;
if (selectiveSerialized != null)
selectiveSerialized.ClearPropertiesToSerialize();
var category = new Category
SubCategory = new Category
SubCategory = new Category
var settings = new JsonSerializerSettings
ContractResolver = new JsonSelectiveSerializeContractResolver(),
Formatting = Formatting.Indented,
Console.WriteLine("Initial Category: ");
Console.WriteLine(JsonConvert.SerializeObject(category, settings));
Console.WriteLine("Serialized after changing nothing: ");
Console.WriteLine(JsonConvert.SerializeObject(category, settings));
Console.WriteLine("Serialized after changing name: ");
Console.WriteLine(JsonConvert.SerializeObject(category, settings));
category.SubCategory = new Category
Name = "new SubCategory",
Console.WriteLine("Serialized after changing SubCategory: ");
Console.WriteLine(JsonConvert.SerializeObject(category, settings));
public static void Main()
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);