2017-08-29 49 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 –