2017-08-29 47 views
2

我有JSON中的問題列表。他們每個人都包含答案列表。當我反序列化它時,答案列表不會反序列化。我只是用空的答案清單收到問題。我怎樣才能解決這個問題?

我反序列化反序列化列表Json C中的列表#

List<QuestionTxt> myDeserializedObjList = (List<QuestionTxt>)Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(@"d:\test.txt"), typeof(List<QuestionTxt>)); 

JSON

[ 
    { 
     "answers": [ 
      { 
       "answer": "1", 
       "text": "First" 
      }, 
      { 
       "answer": "Second", 
       "text": "2" 
      } 
     ], 
     "cost": 1.0, 
     "count": 2, 
     "image": false, 
     "imagePath": null, 
     "name": "Numbers", 
     "about": "Numbers", 
     "solve": false, 
     "type": "Сonformity", 
     "Id": "cnf0" 
    }, 
    { 
     "answers": [ 
      { 
       "answer": "+", 
       "text": "One" 
      }, 
      { 
       "answer": "-", 
       "text": "Two" 
      } 
     ], 
     "cost": 1.0, 
     "count": 2, 
     "image": false, 
     "imagePath": null, 
     "name": "Numbers 2", 
     "about": "Numbers 2", 
     "solve": false, 
     "type": "One", 
     "Id": "rdb0" 
    } 
] 

QuestionTxt

Answer class

回答

class Answer 
{ 
    private string text_; 
    private string answer_; 

    public Answer(string text, string answer) 
    { 
     this.text = text; 
     this.answer = answer; 
    } 

    public string answer { get => answer_; set => answer_ = value; } 
    public string text { get => text_; set => text_ = value; } 
} 
+5

顯示'QuestionTxt'類 – Fabio

+0

@Fabio添加QuestionTxt – SummertimeSadness

+1

我們還需要看到答案對象。請將代碼粘貼到您的問題中,請勿鏈接圖片。 –

回答

3

物業QuestionTxt.answers應該是public(你有internal

public class QuestionTxt 
{ 
    public List<Answer> answers { get; set; } // notice public! 
    public string name { get; set; } 

    public QuestionTxt() 
    { 
     answers = new List<Answer>(); 
    } 
} 

或者,如果您希望保持它internal - 使用JsonPropertyAttribute

public class QuestionTxt 
{ 
    [JsonProperty()] 
    internal List<Answer> answers { get; set; } // notice internal! 
    public string name { get; set; } 

    public Question() 
    { 
     answers = new List<Answer>(); 
    } 
} 

,當然所有的類,你要反序列化應該有參構造函數。

JsonPropertyAttribute通知,你會得到一個自由遵循的.Net約定財產的名稱,在不違反JSON約定

public class QuestionTxt 
{ 
    [JsonProperty("answers")] 
    public List<Answer> Answers { get; set; } 

    [JsonProperty("name")] 
    public string Name{ get; set; } 

    public Question() 
    { 
     Answers = new List<Answer>(); 
    } 
} 

public class Answer 
{ 
    [JsonProperty("answer")] 
    public string Value { get; set; } 

    [JsonProperty("text")] 
    public string Text { get; set; } 
} 
+1

「Property QuestionTxt.answers應公開(您有內部)」 這解決了我的問題,謝謝。感謝所有幫助我的人,我認爲關於構造函數的評論也幫助了我。 – SummertimeSadness

3

你的答案類需要有一個過載不帶參數是這樣的。當Newtonsoft試圖實例化對象時,它不知道該交給構造函數的參數。

​​

你QuestionTxt類有這樣的: private List<Answer> answers_ = new List<Answer)(); 嘗試使該行private List<Answer> answers_;,因爲這不是在構造函數中。然後,您的內部財產具有與其他答案中指出的名稱相同的內部財產。 我會複製並修復它,但它是一個圖像,我不打算輸出整個事情。

編輯:增加了關於QuestionTxt類的信息。法比奧在評論中是正確的,爲了改善你的代碼,屬性可以有自動訪問器。爲了清楚起見,還將答案屬性更改爲AnswerName以將其與類名稱分開。

+0

已更改公共答案,已添加構造函數但沒有參數,問題仍然相同 – SummertimeSadness

+0

更改您的如果您在對象中更改了它,則可以使用Json文件來大寫「應答」和「文本」屬性。 –

+0

實際上可能不太適合具有與對象相同的屬性名稱。讓我們將其更改爲AnswerName –