程式的做法是宣告兩個繼承自DefaultContractResolver的類別: LimitPropsContractResolver在建構時傳入string[]參數列出要序列化的屬性名稱,並覆寫CreateProperties方法,過濾base.CreateProperties()傳回的IList<JsonProperty>,只保留前述string[]有列出的屬性;HideAgeContractResolver則覆寫CreateProperty()方法,由base.CreateProperty()取得JsonProperty,JsonProperty有個ShouldSerialize屬性可以傳入Lambda運算式,逐筆處理每個要序列化的物件,在Lambda運算式中可將物件轉型為原型別進行判斷,若不要序列化就傳回false。
using System.Collections.Generic;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
namespace ConsoleApplication1
public string Name { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }
public int Age { get; set; }
public Person(string name, Gender gender, int age)
Name = name; Gender = gender; Age = age;
public class HideAgeContractResolver : DefaultContractResolver
//REF: http://james.newtonking.com/projects/json/help/index.html?topic=html/ContractResolver.htm
protected override JsonProperty CreateProperty(MemberInfo member,
MemberSerialization memberSerialization)
JsonProperty p = base.CreateProperty(member, memberSerialization);
if (p.PropertyName == "Age")
p.ShouldSerialize = instance =>
Person person = (Person)instance;
return person.Gender == Gender.Male;
public class LimitPropsContractResolver : DefaultContractResolver
public LimitPropsContractResolver(string[] props)
//REF: http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size.aspx
protected override IList<JsonProperty> CreateProperties(Type type,
MemberSerialization memberSerialization)
IList<JsonProperty> list =
base.CreateProperties(type, memberSerialization);
return list.Where(p => props.Contains(p.PropertyName)).ToList();
static void Main(string[] args)
List<Person> list = new List<Person>();
list.Add(new Person("George", Gender.Male, 18));
list.Add(new Person("Mary", Gender.Female, 40));
Console.WriteLine(JsonConvert.SerializeObject(
list, Formatting.Indented));
var settings = new JsonSerializerSettings();
//加上ContractResolver,正向表列哪些屬性要序列化
settings.ContractResolver =
new LimitPropsContractResolver("Name,Age".Split(','));
Console.WriteLine(JsonConvert.SerializeObject(
list, Formatting.Indented, settings));
//加上ContractResolver,依物件的屬性值動態決定要不要序列化
settings.ContractResolver = new HideAgeContractResolver();
Console.WriteLine(JsonConvert.SerializeObject(
list, Formatting.Indented, settings));
程式執行結果如下,共有三段輸出,第一段為正常版;第二段套用LimitPropsContractResolver("Name,Age".Split(',')),故JSON中只見Name及Age,Gender被隱藏;第三段套用了HideAgeContractResolver(),如結果所示,Mary的JSON內容不包含年齡,George則包含。