[英]Deserializing multiple Json objects from URL to List<T> in c#
我正在嘗試通過這樣的API調用反序列化多個Json對象: http : //jservice.io/api/clues? category=2537&value= 400
但是,當我運行代碼時,我再也不會超越Json轉換,並且在調用GetQuestions()方法時什么也不會返回給客戶端。
我想將id,問題,答案和值保存在自定義c#對象中,所以我制作了此類:
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和值,然后根據要反序列化的值創建URL。 理想情況下,我要將包含所有問題的容器退還給客戶。 我上了一堂課,討論了收到的所有問題:
public class DataContainer
{
public List<JsonQuestion> Questions { get; set; }
}
我與DeserializeObject調用一起使用。
首先 ,您對json如何反序列化數組有錯誤的認識。 如果您查看代碼中引發的異常,則會遇到第一個錯誤:
附加信息:無法將當前JSON數組(例如[1,2,3])反序列化為類型'Application.Program + DataContainer',因為該類型需要JSON對象(例如{“ name”:“ value”})才能正確反序列化。
要解決此錯誤,可以將JSON更改為JSON對象(例如{“ name”:“ value”}),也可以將反序列化類型更改為數組,或者將實現集合接口的類型(例如ICollection,IList)更改為List,例如List從JSON數組反序列化。 還可以將JsonArrayAttribute添加到類型中,以強制其從JSON數組反序列化。
您想做的是將數組反序列化為對象,沒有巫婆是不可能的。 因此,您將需要像這樣的json結構:{“問題”:[json的內容]}。 為了避免這種情況,您必須將反序列化更改為:
JsonConvert.DeserializeObject<List<JsonQuestion>>(json);
其次 ,JsonConvert將采用提供的最簡單的構造函數,並嘗試使用它來創建嵌套結構,而您有多個。 因此,每次必須調用構造函數時,JsonConvert都將使用public JsonQuestion(string categoryId, int value)
,其休耕值為null和400(這些值取自嵌套項目,女巫的參數值設置為400,而沒有參數categoryId) 。 因此,每當新的json文檔將被下載時,您就陷入循環循環。 您要做的是提供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; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.