簡體   English   中英

將多個Json對象從URL反序列化為List <T> 在C#中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM