JSON.Net - 无法将当前json对象(例如{“name”:“value”})反序列化为类型'system.collections.generic.list`1

时间:2014-12-25 09:30:39

标签: c# json json.net json-deserialization

我有一个类似

的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对象(例如{&#34; name&#34;:&#34; value&#34;})   进入类型&#39; System.Collections.Generic.List`1 [ClassNameHere]&#39;因为   该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。

如果我更改代码如下:

var mList= JsonConvert.DeserializeObject(jsonstr);

然后它序列化但不作为列表,作为对象。我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:8)

在这种情况下,您应该向反序列化程序询问 IDictionary<string, Match>

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

并且第一个元素将具有键&#34; 40&#34; ,并且值将是Match实例

其他的话这一部分:

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

将导致KeyValuePair:

key - "40"
value - Match { Name = "Team",  ... }

答案 1 :(得分:4)

"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被声明为一个对象数组。请注意[]