2012-03-22 15 views
54

JSONにシリアル化する必要のあるデータがあります。私はJSON.NETを使用しています。私のコードの構造は、次のようになります。Json.netでnullフィールドを無視する

public struct structA 
{ 
    public string Field1; 
    public structB Field2; 
    public structB Field3; 
} 

public struct structB 
{ 
    public string Subfield1; 
    public string Subfield2; 
} 

問題がある、私のJSON出力はONLY Field1 OR Field2 OR Field3を持っている必要があります - それは、どのフィールドが使用されている(すなわち、nullではない)によって決まります。 デフォルトでは、私のJSONは次のようになります。

{ 
    "Field1": null, 
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"}, 
    "Field3": {"Subfield1": null, "Subfield2": null}, 
} 

私はNullValueHandling.Ignoreを使用することができます知っているが、それはこのようになりますその私にJSONを与える:

{ 
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"}, 
    "Field3": {} 
} 

そして、何私は必要がこれです:

{ 
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"}, 
} 

これを達成する簡単な方法はありますか?

+0

[json.netを使用して、nullの場合にクラス内のプロパティを無視する方法](http://stackoverflow.com/questions/6507889/how-to-ignore-a-property-in-class-if) -null-using-json-net) –

答えて

58

はい、JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignoreを使用する必要があります。

しかし、あなたが期待する結果を得るためにフィールド2、フィールド3 NULL可能をマークする必要がありstructs are value types理由:

public struct structA 
{ 
    public string Field1; 
    public structB? Field2; 
    public structB? Field3; 
} 

それともクラスの代わりに構造体を使用します。

ドキュメント:NullValueHandling Enumeration

+1

詳細については、http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-sizeを参照してください。 aspx –

54

また、関連するプロパティにJsonProperty属性を適用し、そのように扱うnull値を設定することができます。以下の例のReferenceプロパティを参照してください。

注:JsonSerializerSettingsは属性を無効にします。

public class Person 
{ 
    public int Id { get; set; } 

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public int? Reference { get; set; } 

    public string Name { get; set; } 
} 

Hth。

関連する問題