我有这段代码从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
答案 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,因为从我可以看到它返回的内容,你将会变得很糟糕很多要求。