5

逆シリアル化する必要がある json オブジェクトを返す API を使用しています。私の問題は、これらのオブジェクトのメンバーの 1 つが空の配列 ("[]") である場合と、辞書 ("{"1":{...}, "2":{...}}") である場合があることです。 )。ID は気にしないので、配列または辞書のいずれかにデシリアライズしたいと考えています。すべてのオブジェクトのリストが必要なだけです。オブジェクトを逆シリアル化する方法は次のとおりです。

var response = JsonConvert.DeserializeObject<Response>(json);

Response クラスの定義は次のとおりです。

public class Response
{
    [JsonProperty(PropertyName = "variations")]
    public Dictionary<int, Variation> Variations { get; set; }
}

Response のバリエーション フィールドに辞書が含まれている場合はうまく機能しますが、空の配列が含まれている場合は失敗します。Newtonsoft から、配列をディクショナリにデシリアライズできないというエラーが表示されます。Variations プロパティを配列として定義すると、空の配列では機能しますが、辞書の場合は失敗します。可能な値の両方を正しく逆シリアル化するか、空の配列を無視して、失敗するのではなく配列の場合に Variations を null に設定するにはどうすればよいでしょうか。

ありがとう。

4

3 に答える 3

1

これが私が使用した解決策です:

    public Dictionary<int, Variation> Variations
    {
        get
        {
            var json = this.VariationsJson.ToString();
            if (json.RemoveWhiteSpace() == EmptyJsonArray)
            {
                return new Dictionary<int, Variation>();
            }
            else
            {
                return JsonConvert.DeserializeObject<Dictionary<int, Variation>>(json);
            }
        }
    }

    [JsonProperty(PropertyName = "variations")]
    public object VariationsJson { get; set; }

基本的に、バリエーションは最初に基本オブジェクトで逆シリアル化されます。値を読み取りたいときは、オブジェクトが空の配列かどうかを確認し、そうであれば空の辞書を返します。オブジェクトが適切な辞書である場合は、それを逆シリアル化して返します。

于 2012-09-04T16:08:47.893 に答える