メンバーが装飾されている多くのデータ コントラクトを持つシステムがあります。
[DataMember(EmitDefaultValue = false)]
JSON にシリアル化するときに null のときにメンバーを含める必要がある場合があります。どのようなシリアライザー設定を選択しても、これを機能させることはできません。
[TestMethod]
public void SerializationTest()
{
var contract = Activator.CreateInstance(typeof(TestContract));
var formatter = new JsonMediaTypeFormatter
{
SerializerSettings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Include,
DefaultValueHandling = DefaultValueHandling.Ignore,
TypeNameHandling = TypeNameHandling.All,
ContractResolver = new DataContractResolver(),
Binder = new DataContractBinder()
}
};
var result = JsonConvert.SerializeObject(contract, formatter.SerializerSettings);
}
プロパティごとに追加のオーバーライドを提供するカスタム データ コントラクト リゾルバーも作成しました。
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, MemberSerialization.Fields);
property.NullValueHandling = NullValueHandling.Include;
property.DefaultValueHandling = DefaultValueHandling.Ignore;
property.ShouldSerialize = o => true;
return property;
}
エミットのデフォルト値 = false を無視するために、null 値の処理とデフォルト値の処理のすべてのバリエーションを試しました。json net docs によると、これらの設定により、オブジェクトの null プロパティが得られるはずです。json ネット ソースをデバッグする前に、他に不足しているものはありますか?