c#将json反序列化为List

时间:2015-04-02 14:59:26

标签: c# json list object serialization

我有这段代码从API链接中检索Json字符串。 Json被反序列化并返回到文本框。只要只有1个Json值,返回的值超过1,它就会崩溃并出现此错误:

  

其他信息:无法反序列化当前的JSON数组   (例如[1,2,3])因为类型而导入类型'GW2_tradingPost.RootObject'   需要一个JSON对象(例如{“name”:“value”})来反序列化   正确。

     

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

进行我的研究是因为Json因为它不是List而无处存放。

我已经尝试过这段代码和各种类似的代码。

List<RootObject> list = JsonConvert.DeserializeObject<List<RootObject>>(jsonReader.ToString());
return list;

这将返回错误:

  

错误1无法隐式转换类型   'System.Collections.Generic.List'到   'GW2_tradingPost.RootObject'e:\ mega \ gw2_tradingpost \ gw2_tradingpost \ api_request.cs 34

我完全不明白这意味着什么。

这是我的完整代码。

api_Request.cs

public class api_Request
    {
        public RootObject GetApi(string url)
        {

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            try
            {
                WebResponse response = request.GetResponse();
                using (Stream responseStream = response.GetResponseStream())
                {
                 StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                var jsonReader = new JsonTextReader(reader);
                var serializer = new JsonSerializer();
                return serializer.Deserialize<RootObject>(jsonReader);
            }
            }
            catch (WebException ex)
            {
                WebResponse errorResponse = ex.Response;
                using (Stream responseStream = errorResponse.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                    String errorText = reader.ReadToEnd();
                    // log errorText
                }
                throw;
            }
        }

    }


    public class Buy
    {
        public int listings { get; set; }
        public int unit_price { get; set; }
        public int quantity { get; set; }
    }

    public class Sell
    {
        public int listings { get; set; }
        public int unit_price { get; set; }
        public int quantity { get; set; }
    }

    public class RootObject
    {
        public int id { get; set; }
        public List<Buy> buys { get; set; }
        public List<Sell> sells { get; set; }
    }

Form1.cs的

 private void button1_Click(object sender, EventArgs e)
        {
            RootObject RootObject = new RootObject();
            api_Request api_Request = new api_Request();
            richTextBox1.Text = api_Request.GetApi("https://api.guildwars2.com/v2/commerce/listings").id.ToString();
        }

在这个json是一个ID,所以这很好。 https://api.guildwars2.com/v2/commerce/listings/19684

但是当像这里一样检索多个ID时,它会中断。 https://api.guildwars2.com/v2/commerce/listings

2 个答案:

答案 0 :(得分:1)

这是一个简单的解决方案,可以获得所有内容的列表,但是通过这些内容会花费很多时间

  List<RootObject> rootobject = new List<RootObject>();
    using (var webclient = new WebClient())
    {
        var Ids = webclient.DownloadString(" https://api.guildwars2.com/v2/commerce/listings");
        foreach (var id in Ids.Substring(1, s.Length-2).Split(','))
        {
            string url = string.Format("{0}/{1}","https://api.guildwars2.com/v2/commerce/listings",id);
            var res = webclient.DownloadString(url);
            var jsonObject = JsonConvert.DeserializeObject<RootObject>(res);
            rootobject.Add(jsonObject);
        }


    }

答案 1 :(得分:0)

您为多个ID提供的链接返回一个整数数组。我建议解析这个:

var ids = JsonConvert.DeserializeObject<int[]>(jsonReader.ToString())

正如您所说,您的代码适用于单个项目,因此您可以将现有代码用于每个单独的请求,而不是点击https://api.guildwars2.com/v2/commerce/listings,而是https://api.guildwars2.com/v2/commerce/listings/{id}您可以使用{ {1}}添加需要的地方。

请认真考虑在string.Format()中你实际想要获取根对象的id中返回了多少id,因为从我可以看到它返回的内容,你将会变得很糟糕很多要求。