我试图从这样的API调用反序列化多个Json对象:http://jservice.io/api/clues?category=2537&value=400
但是当我运行我的代码时,我从未通过Json转换,并且在调用GetQuestions()方法时没有任何内容返回给客户端。
我想在自定义c#对象中保存id,问题,答案和值,所以我创建了这个类:
public class JsonQuestion
{
private DataContainer container;
public int id { get; set; }
public string answer { get; set; }
public string question { get; set; }
public int value { get; set; }
public JsonQuestion(string categoryId, int value)
{
using (var webClient = new System.Net.WebClient())
{
var json = webClient.DownloadString("http://jservice.io/api/clues?category=" + categoryId + "&value=" + value);
container = JsonConvert.DeserializeObject<DataContainer>(json);
}
}
public DataContainer GetQuestions()
{
return container;
}
}
这里我收到构造函数的categoryID和value,然后根据要反序列化的值创建URL。理想情况下,我想将容纳所有问题的容器返回给客户。 我上了一堂课,收到了所有问题:
public class DataContainer
{
public List<JsonQuestion> Questions { get; set; }
}
我使用DeserializeObject调用。
答案 0 :(得分:2)
首先你对json如何反序列化数组有错误的想法。如果您查看引入代码的异常,您将会遇到第一个错误:
附加信息:无法将当前JSON数组(例如[1,2,3])反序列化为“Application.Program + DataContainer”类型,因为该类型需要JSON对象(例如{“name”:“value”})正确地反序列化。
要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList)可以从JSON数组反序列化的列表。 JsonArrayAttribute也可以添加到类型中,以强制它从JSON数组反序列化。
你要做的是将数组反序列化为对象,这是不可能的。所以你需要像这样的json结构:{“问题”:[你的json的内容]}。为避免这种情况,您必须将反序列化更改为:
JsonConvert.DeserializeObject<List<JsonQuestion>>(json);
第二次,JsonConvert将采用最简单的构造函数,并将尝试使用它来创建嵌套的结构,你有多个。因此,每次必须调用构造函数时,JsonConvert将使用public JsonQuestion(string categoryId, int value)
以及null和400的值(这些值从嵌套项中获取,其参数值设置为400且没有参数categoryId)。因此,每次下载新的json文档时,您都将陷入recuring循环。你要做的是提供JsonQuestion的公共默认构造函数。
整个代码看起来像这样:
public class JsonQuestion
{
private List<JsonQuestion> container;
public int id { get; set; }
public string answer { get; set; }
public string question { get; set; }
public int value { get; set; }
public JsonQuestion()
{
}
public JsonQuestion(string categoryId, int value)
{
using (var webClient = new System.Net.WebClient())
{
var json = webClient.DownloadString("http://jservice.io/api/clues?category=" + categoryId + "&value=" + value);
var container = JsonConvert.DeserializeObject<List<JsonQuestion>>(json);
}
}
public DataContainer GetQuestions()
{
return new DataContainer
{
Questions = container,
};
}
}
public class DataContainer
{
public List<JsonQuestion> Questions { get; set; }
}