无法反序列化当前JSON数组(例如[1,2,3]). C#,无法找出错误 [英] Cannot deserialize the current JSON array (e.g. [1,2,3]). C#, cant figure the error out

查看:377
本文介绍了无法反序列化当前JSON数组(例如[1,2,3]). C#,无法找出错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to retrieve all names from the following json data and put it in a textbox.

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

This is the json data I have shortened some values to make it easier to read but it does not effect the question.

    [{
"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 ]}]

但是我无法缝到所有这些名称而没有收到此错误:

However I cant seam to fetch all these names without getting this error:

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

An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll

其他信息:无法反序列化当前JSON数组 (例如[1,2,3])转换为类型'MTGLibrary.CardSetFind + CardSet',因为 类型需要JSON对象(例如{"name":"value"})进行反序列化 正确.

Additional information: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'MTGLibrary.CardSetFind+CardSet' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

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

To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.

路径",第1行,位置1.

Path '', line 1, position 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; }  

    }

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

This is the method to retrieve information from all sets.

        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;
    }

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

And this is the code I use in my form.

        public void fillBox()
    {
        textBox5.Text = CardSetFind.allCardSets().name;
    }

有人可以帮助我吗? 谢谢您阅读

Can someone help me? Thank you for reading

推荐答案

您的JSON实体是一个数组,而不是单个对象.这就是为什么JSON.NET要求您进行反序列化的原因!

Your JSON entity is an array rather than a single object. This is why JSON.NET is crying about your deserialization!

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

Deserialize this JSON as an IEnumerable<T> and you'll solve your issue:

IEnumerable<CardSet> result = JsonConvert.DeserializeObject<IEnumerable<CardSet>>(jsonText);

这篇关于无法反序列化当前JSON数组(例如[1,2,3]). C#,无法找出错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆