[英]Deserialize List in List Json C#
我有JSON中的問題列表。 它們每個都包含答案列表。 在反序列化時,答案列表不會反序列化。 我只是用空答案列表來提問。 我怎樣才能解決這個問題?
我的反序列化
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
回答
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; }
}
您的答案類需要具有不包含此類參數的重載。 當Newtonsoft嘗試實例化對象時,它不知道該交給構造函數的參數。
public class Answer
{
public Answer()
{
}
public Answer(string text, string answer)
{
this.text = text;
this.answer = answer;
}
public string AnswerName { get;set; }
public string Text { get;set; }
}
您的QuestionTxt類具有以下內容: private List<Answer> answers_ = new List<Answer)();
嘗試將該行private List<Answer> answers_;
因為這不在構造函數中。 然后,您將擁有一個內部屬性,其名稱與其他答案中指出的名稱相同。 我會復制並修復它,但它只是一張圖片,我不會將整個內容都打出來。
編輯:添加了有關QuestionTxt類的信息。 Fabio在注釋中是正確的,為了改進代碼,該屬性可以具有自動訪問器。 為了清楚起見, AnswerName
answer屬性更改為AnswerName
以將其與類名稱分開。
屬性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; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.