无法反序列化当前的JSON数组(例如[1,2,3]).C#,无法找出错误

Red*_*erg 5 c# api serialization json deserialization

我正在尝试从以下json数据中检索所有名称并将其放在文本框中.

这是我缩短了一些值的json数据,使其更易于阅读,但它不会影响问题.

    [{
"id": "LEA",
"name": "Limited Edition Alpha",
"block": null,
"type": "Core",
"description": "The name Alpha refers to the first print run of the \n  original Magic: The Gathering Limited Edition, the first Magic: The Gathering \n  card set. It premiered in a limited release at Origins Game Fair in 1993, with \n  a general release that August. Its print run of 2.6 million cards sold out very quickly and was replaced by Limited Edition's Beta print run. Limited Edition cards have no expansion symbol, no copyright date, no trademark symbols, although they do list the art credits at the bottom of the card.",
"common": 74,
"uncommon": 95,
"rare": 116,
"mythicRare": 0,
"basicLand": 10,
"total": 295,
"releasedAt": "1993-08-05",
"cardIds": [
  226,
  275,
  245
]  },{
"id": "LEB",
"name": "Limited Edition Beta",
"block": null,
"type": "Core",
"description": "Limited Edition Beta or just Beta refers to the second \n  print run of the original Magic: The Gathering Limited Edition, the first \n  Magic: The Gathering card set. It was released as soon as Wizards of the \n  Coast could afford to pay for the rest of the print run. The company took \n  advantage of the fact that the first edition print run had been split to \n  correct some minor problems in the rules and fix some errors on the cards. \n  Clarifications were made to the rulebook, and Richard Garfield's short fiction \n  'Worzel's Tale' was removed to make room. Like Alpha it had no expansion symbol, \n  and the text on the bottom left consisted of only the artist credit. \n  Although many players speak of Alpha and Beta as different sets, officially \n  they are the same set, and the company had expected that people wouldn't \n  necessarily be able to tell the two press runs apart. However, the printer \n  accidentally used different corner rounding dies for the second run, resulting \n  in the two distinct sets.",
"common": 75,
"uncommon": 95,
"rare": 117,
"mythicRare": 0,
"basicLand": 10,
"total": 297,
"releasedAt": "1993-10-01",
"cardIds": [
  390,
  571,
  361,
  505,
  369,
  315 ]}]
Run Code Online (Sandbox Code Playgroud)

但是我无法获取所有这些名称而不会收到此错误:

Newtonsoft.Json.dll中发生未处理的"Newtonsoft.Json.JsonSerializationException"类型异常

附加信息:无法将当前JSON数组(例如[1,2,3])反序列化为类型"MTGLibrary.CardSetFind + CardSet",因为该类型需要JSON对象(例如{"name":"value"})才能正确反序列化.

要修复此错误,请将JSON更改为JSON对象(例如{"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如List从JSON数组反序列化.JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化.

路径'',第1行,第1位.

这是我的班级:

        public class CardSet
    {
        public string id { get; set; }
        public string name { get; set; }
        public string type { get; set; }
        public string block { get; set; }
        public string description { get; set; }
        public int common { get; set; }
        public int uncommon { get; set; }
        public int rare { get; set; }
        public int mythicRare { get; set; }
        public int basicLand { get; set; }
        public int total { get; set; }
        public DateTime releasedAt { get; set; }
        public int[] cardIds { get; set; }  

    }
Run Code Online (Sandbox Code Playgroud)

这是从所有集合中检索信息的方法.

        public static T _download_serialized_json_data<T>(string url) where T : new()
    {
        using (var w = new WebClient())
        {
            var json_data = string.Empty;
            try
            {
                json_data = w.DownloadString(url);
            }
            catch (Exception) { }
            return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T();
        }

    }



        public static CardSet allCardSets()
    {
        var url = "http://api.mtgdb.info/sets/";
        var foundSet = _download_serialized_json_data<CardSet>(url);
        CardSet setInfo = foundSet;
        return setInfo;
    }
Run Code Online (Sandbox Code Playgroud)

这是我在表单中使用的代码.

        public void fillBox()
    {
        textBox5.Text = CardSetFind.allCardSets().name;
    }
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗?谢谢你的阅读

Mat*_*zer 9

您的JSON实体是一个数组而不是一个对象.这就是JSON.NET为你的反序列化而烦恼的原因!

将此JSON反序列化为IEnumerable<T>您将解决您的问题:

IEnumerable<CardSet> result = JsonConvert.DeserializeObject<IEnumerable<CardSet>>(jsonText);
Run Code Online (Sandbox Code Playgroud)