簡體   English   中英

在列表Json C#中反序列化列表

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

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