web-dev-qa-db-ja.com

JSON.Net-現在のjsonオブジェクト(例:{"name": "value"})をタイプ 'system.collections.generic.list`1に逆シリアル化できません

私は次のようなJSONを持っています

{
  "40": {
    "name": "Team A vs Team B",
    "value": {
      "home": 1,
      "away": 0
    }
  },
  "45": {
    "name": "Team A vs Team C",
    "value": {
      "home": 2,
      "away": 0
    }
  },
  "50": {
    "name": "Team A vs Team D",
    "value": {
      "home": 0,
      "away": 2
    }
  }
}

つまり、これは一種の一致リストです。そして、私はそれを次のように逆シリアル化するクラスを持っています:

public class Match
{
    [JsonProperty(PropertyName = "name")]
    public string Name { get; set; }
    [JsonProperty(PropertyName = "value")]
    public Value Values { get; set; }
}

public class Value
{
    [JsonProperty(PropertyName = "home")]
    public int Home { get; set; }
    [JsonProperty(PropertyName = "away")]
    public int Away { get; set; }
}

私は次のようにjsonを逆シリアル化しようとしています:

var mList= JsonConvert.DeserializeObject<List<Match>>(jsonstr);

しかし、私は例外を得ています:

タイプにはJSON配列([1,2,3]など)が必要なため、現在のJSONオブジェクト({"name": "value"}など)をタイプ 'System.Collections.Generic.List`1 [ClassNameHere]'に逆シリアル化できません。 )正しく逆シリアル化する。

次のようにコードを変更した場合:

var mList= JsonConvert.DeserializeObject(jsonstr);

次に、シリアル化されますが、リストとしてではなく、オブジェクトとしてシリアル化されます。どうすればこれを修正できますか?

6
Sefa

この場合、DeserializerにIDictionary<string, Match>

var mList= JsonConvert.DeserializeObject<IDictionary<string, Match>>(jsonstr);

そして、最初の要素にはキーがあります"40"そして値はMatchインスタンスになります

言い換えれば、この部分:

"40": {
    "name": "Team A vs Team B",
    "value": {
      "home": 1,
      "away": 0
    }

keyValuePairになります:

key - "40"
value - Match { Name = "Team",  ... }
8
Radim Köhler
"50": {
         "name": "Team A vs Team D",
         "value": {
                    "home": 0,
                    "away": 2
                  }
      }

Desirializerは正しく動作します。このjsonコードでは、valueはオブジェクトです。これで試してください:

"50": {
         "name": "Team A vs Team D",
         "value": [{
                     "home": 0,
                     "away": 2
                  }]
      }

このjsonコードでは、valueがオブジェクトの配列として宣言されています。 []に注意してください

4
mstrewe