64

さまざまなリストを「遅延作成」するレガシーオブジェクトをシリアル化しようとしています。従来の動作を変更できません。

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

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 );

    }
}

現在の結果: { "Identity": 123, "Numbers": [] }

取得したい: { "Identity": 123 }

つまり、空のリスト、コレクション、配列などをスキップしたいと思います。

4

4 に答える 4

86

これに対する解決策が見つからなかった場合でも、問題を突き止めることができれば、答えは非常に簡単です。

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

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

このアプローチは私にとってはうまくいきます(VB.NETではありますが)。元のクラスを変更することが許可されていない場合はIContractResolver、リンクされたページに記載されているアプローチが有効です。

于 2012-11-05T18:28:25.203 に答える
3

ペンダントのコモンオーガーデンになるために、ifテストを次のように構成しました。

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

多くの場合、空のリストも null になるためです。解決策を投稿していただきありがとうございます。ATB。

于 2013-07-02T13:44:20.027 に答える