2016-08-15 9 views
2

私はメンバーが飾られている多くのデータコントラクトを持つシステムがあります。JSON.net

[DataMember(EmitDefaultValue = false)] 

私はメンバーが含まれる必要があるケースを持っているの際はnullときJSONにシリアル化されています。私が選んだシリアライザの設定に関係なく、これを動作させることはできません。

[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; 
    } 

私はemitのデフォルト値= falseを無視するために、すべてのバリエーションのnull値の処理とデフォルト値の処理を試しました。 json net docsによると、これらの設定は私のオブジェクトにnullプロパティを与えるはずです。 jsonのネットソースをデバッグする前に、他に何かがありますか?

答えて

2

あなたが契約リゾルバにproperty.DefaultValueHandling = DefaultValueHandling.IncludeではなくDefaultValueHandling.Ignoreを設定する必要があります。

public class DataContractResolver : DefaultContractResolver 
{ 
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     var property = base.CreateProperty(member, memberSerialization); 
     property.NullValueHandling = NullValueHandling.Include; 
     property.DefaultValueHandling = DefaultValueHandling.Include; 
     property.ShouldSerialize = o => true; 
     return property; 
    } 
} 

Json.NETがメンバーをシリアライズする前にDefaultValueHandlingNullValueHandlingの両方をチェックし、両方チェックがメンバーのために渡す必要があります直列化される。どちらかが契約者のプロパティに明示的に設定されている場合と、あなたは気づいているとして、それはJsonSerializerSettingsで設定を上書きします。これは、カスタム契約リゾルバが必要な理由を説明します。

あなたは最高のパフォーマンスのためにcache the contract resolverにしたいかもしれません。

+0

興味深い。 SerializerSettingsを設定するときに、その組み合わせを試してみました。ドキュメントはあなたがとにかく無視使うことになっているようにそれが聞こえるので、私はオーバーライドで同様のことを行っていませんでした。これらの設定を使用し、カスタムリゾルバを使用する場合は動作します。属性を上書きすることが許可されているかどうかを設定に伝える方が良い方法のようです。ありがとう。 – twifosp