2012-07-04 14 views
33

さまざまなリストを「怠惰に作成する」レガシーオブジェクトをシリアライズしようとしています。私は従来の動作を変更することはできません。Newtonsoft Json.NETは空のリストのシリアライズをスキップできますか?

私はこの簡単な例には、それを煮詰めた:私は

なる現在の結果である

public class Junk 
{ 
    protected int _id; 

    [JsonProperty(PropertyName = "Identity")] 
    public int ID 
    { 
     get 
     { 
      return _id; 
     } 

     set 
     { 
      _id = value; 
     } 
    } 

    protected List<int> _numbers; 
    public List<int> Numbers 
    { 
     get 
     { 
      if(null == _numbers) 
      { 
       _numbers = new List<int>(); 
      } 

      return _numbers; 
     } 

     set 
     { 
      _numbers = value; 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Junk j = new Junk() { ID = 123 }; 

     string newtonSoftJson = JsonConvert.SerializeObject(j, Newtonsoft.Json.Formatting.Indented); 

     Console.WriteLine(newtonSoftJson); 

    } 
} 

: {[] "同一性":123、 "番号"}好きなもの: { "ID":123 }

つまり、私はリストをすべてスキップしたい配列、または空であるものなどが含まれます。

答えて

49

解決策が見つからない場合は、the answerを追跡すると非常に簡単です。

元のクラスを拡張することが許可されている場合は、ShouldSerializePropertyName関数を追加します。これは、クラスの現在のインスタンスに対してそのプロパティを直列化する必要があるかどうかを示すブール値を返す必要があります。あなたの例では、これは(テストしていますが、画像を取得する必要がありません)次のようになります。

public bool ShouldSerializeNumbers() 
{ 
    return _numbers.Count > 0; 
} 

このアプローチは(VB.NETでいえ)私のために動作します。元のクラスを変更することが許可されていない場合は、リンクされたページに記載されているIContractResolverのアプローチが必要です。ただ、pendantic commonorgardenすべき

+12

「return(_numbers.Count> 0);」に簡略化することができます。 –

+2

私はそれが好きです!良いですね。 –

+3

一般的な方法で対応できますか?私はすべてのプロパティ名を知っているわけではありませんが、すべての空の配列をnullにする必要があります。 – Rohit

1

は、テストをする場合、私は構造:空のリストとして

public bool ShouldSerializecommunicationmethods() 
{ 
    if (communicationmethods != null && communicationmethods.communicationmethod != null && communicationmethods.communicationmethod.Count > 0) 
     return true; 
    else 
     return false; 
} 

をしばしばあまりにもnullになります。ソリューションを投稿していただきありがとうございます。 ATB。

+3

もう1つのオプションは、[NullValueHandling]属性を使用することです。[JsonProperty( "yourPropertyName"、NullValueHandling = NullValueHandling.Ignore)]。これはヌルチェックの必要性を減らすのに役立ちます。これはifチェックを少し洗練させます。ちょうど私があなたがそれが便利であるかもしれないとしてそれを言及したいと思った。 –

+0

ShouldSerializeメソッドでもnullをチェックする必要があります。そうでない場合は、ShouldSerializeを呼び出すとnullが例外になります。シリアライザがShouldSerializeメソッドをチェックする際に例外を無視するようにコーディングされていても、例外が発生すると、パフォーマンスに影響を与える不要なオーバーヘッドが追加されます。だから、最初にnullをチェックすることによって、あなたが失うよりも多くのことを得ることができます。 –

関連する問題