API を作成しているときに、要求しているユーザーがアクセスできないモデルのプロパティを除外する必要があることに気付きました。
Json.Net ContractResolver を使用することで、この要件の大部分に対処することができました。
public class ConverterContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, Newtonsoft.Json.MemberSerialization memberSerialization)
{
//filter the properties and return back the final list
}
}
ただし、参照プロパティが熱心に読み込まれるシナリオでは、ContactResolver は効果がないようです。たとえば、次のクラスの場合:
public class Contact
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string AccountId { get; set; }
public Account Account { get; set; }
}
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
public string Website { get; set; }
public string BillingAddress { get; set; }
}
Contact がクエリされている場合、Account レコードはイーガー ロードされる可能性があります。JSON にシリアル化する場合、ContractResolver は、Account フィールドではなく、Contact フィールドにのみフィルターを適用します。
Contact data = new Contact {
FirstName = "John",
LastName = "Duo",
AccountId = 123,
Account = new Account { Id=123, Name="My Company", Website="www.mycompany.com" }
};
string json = Newtonsoft.Json.JsonConvert.SerializeObject(data,
Newtonsoft.Json.Formatting.Indented,
new JsonSerializerSettings {
ContractResolver= new ConverterContractResolver()
});
Json.net が参照プロパティに対しても同じコントラクト リゾルバーを呼び出す方法はありますか?