2017-02-25 87 views
0

我想反序列化多的Json從像這樣的API調用對象列出 http://jservice.io/api/clues?category=2537&value=400 反序列化從URL多個JSON對象在C#

但是當我運行我的代碼,我從來沒有得到過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和價值構造函數,然後創建網址基於這些值進行反序列化。理想情況下,我想將容納所有問題的容器退還給客戶。 我做了保存收到的所有問題的一類:

public class DataContainer 
{ 
    public List<JsonQuestion> Questions { get; set; } 
} 

其中我與DeserializeObject通話使用。

回答

2

第一個你對json如何反序列化數組有所誤解。如果你看看拋出代碼的異常,你會得到你的第一個錯誤:

附加信息:無法反序列化當前JSON數組(例如[1,2,3])到類型'Application.Program + DataContainer',因爲該類型需要JSON對象(例如{「name」:「value」})才能正確地反序列化。

要修復此錯誤,請將JSON更改爲JSON對象(例如{「name」:「value」})或將反序列化類型更改爲實現集合接口的數組或類型(例如ICollection,IList)像List,可以從JSON數組中反序列化。 JsonArrayAttribute也可以添加到類型中,以強制它從JSON數組反序列化。

你要做的是反序列化數組到對象中,女巫是不可能的。所以你需要像這樣的json結構:{「Questions」:[你的json的內容]}。爲了避免這種情況,你有你的反序列化更改爲:

JsonConvert.DeserializeObject<List<JsonQuestion>>(json); 

,JsonConvert將提供簡單的構造,並會嘗試使用它來創建嵌套sturctures,巫婆你有多個。所以每次調用構造函數時,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; } 
    }