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

6

我有一个类似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对象(例如{"name":"value"})反序列化为类型“System.Collections.Generic.List`1[ClassNameHere]”,因为该类型需要一个JSON数组(例如[1,2,3])才能正确反序列化。

如果我改变代码像这样:

var mList= JsonConvert.DeserializeObject(jsonstr);

然后它序列化,但不是作为列表,而是作为对象。我该如何修复这个问题?

在你的JSON字符串开头和结尾处加上方括号[]。 - agentpx
可能是重复的问题:如何解析会导致非法 C# 标识符的 JSON 字符串? - Ilija Dimov
2个回答

9
在这种情况下,您应该向反序列化器请求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",  ... }

你不应该改变文档,而是使用编程代码来管理文档。 - Sterling Diaz
@SterlingDiaz 不确定你的意思是什么?我遵循了JSON结构,展示了如何在C#中表示它...所以,我真的不确定你在这里的观点是什么。 - Radim Köhler

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

反序列化器正常工作。在这个 JSON 代码中,value 是一个对象。 尝试使用以下代码:
"50": {
         "name": "Team A vs Team D",
         "value": [{
                     "home": 0,
                     "away": 2
                  }]
      }

在这个JSON代码中,value被声明为一个对象数组。请注意[]的使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接