我有这段代码可从API链接中检索Json字符串。Json被反序列化并返回到文本框。只要只有1个Json值,此方法就可以完美地工作,如果返回的Json值大于1,则会因以下错误而崩溃:
附加信息:无法将当前JSON数组(例如[1,2,3])反序列化为类型'GW2_tradingPost.RootObject',因为该类型需要JSON对象(例如{“ name”:“ value”})才能正确反序列化。
要解决此错误,可以将JSON更改为JSON对象(例如{“ name”:“ value”}),也可以将反序列化类型更改为数组,或者将实现集合接口的类型(例如ICollection,IList)更改为List,例如List从JSON数组反序列化。还可以将JsonArrayAttribute添加到类型中,以强制其从JSON数组反序列化。
我进行研究是因为没有Json列表,所以没有地方可以存放Json。
我已经尝试过此代码和各种类似的代码。
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
这是获取所有ID列表的简单解决方案,尽管要遍历所有ID,但这将花费大量时间
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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句