11

私がこのようなクラスを持っている場合:

[DataContract(Name = "", Namespace = "")]
public class MyDataObject
{
    [DataMember(Name = "NeverNull")]
    public IList<int> MyInts { get; set; }
}

次の文字列が逆シリアル化されたときに、MyIntsフィールドをnull以外の空のリストにする方法はありますか?

string serialized = @"{""NeverNull"":null}";

MyDataObject myDataObject = JsonConvert.DeserializeObject<MyDataObject>(serialized);

Newtonsoft.Jsonを使用しています

私が尋ねる理由は、解析するかなり複雑なjsonリクエストがあり、オブジェクトのリストのネストが含まれているためです。逆シリアル化コードでこれらのオブジェクトを作成して、多くのnullチェックを回避できるようにします。

if (foo.bar != null)
{
    foreach (var bar in foo.bar)
    {
        if (bar.baz != null)
        {
            foreach (var baz in bar.baz)
            {
                ...
4

2 に答える 2

14

おそらく、デシリアライゼーションの最後にこれをチェックするポストシリアライゼーション コールバックを追加しますか?

[DataContract(Name = "", Namespace = "")]
public class MyDataObject
{
    [OnDeserialized]
    public void OnDeserialized(StreamingContext context)
    {
        if (MyInts == null) MyInts = new List<int>();
    }
    [DataMember(Name = "NeverNull")]
    public IList<int> MyInts { get; set; }
}

また、JsonConvert( とは異なりDataContractSerializer) はデフォルトのコンストラクターを実行するため、通常はデフォルトのコンストラクターを追加することもできます。

    public MyDataObject()
    {
        MyInts = new List<int>();
    }

ただし、この場合、明示 "NeverNull":null的に逆シリアル化中に元に戻すためnull、代わりに上記のコールバックを使用した理由です。

于 2012-08-14T06:09:01.843 に答える
1

IList<int>withの初期化new int[0]が役に立ちます! 最良の結果をもたらすソリューションです。

于 2012-08-14T06:32:33.900 に答える