2016-09-15 76 views
-3

如何轉換JSON數組列出<> C#轉換JSON來列表<> C#

[[{ 
    "QID": 1, 
    "Question": "Question", 
    "IsMultipel": 0 
}, 
{ 
    "QID": 2, 
    "Question": "Question", 
    "IsMultipel": 1 
}], 
[{ 
    "QID": 1, 
    "A_ID": 1, 
    "Answer": "Answer" 
}, 
{ 
    "QID": 1, 
    "A_ID": 2, 
    "Answer": "Answer" 
}, 
{ 
    "QID": 1, 
    "A_ID": 3, 
    "Answer": "Answer" 
}, 
{ 
    "QID": 1, 
    "A_ID": 3, 
    "Answer": "Answer" 
}]] 

錯誤:爲了解決這個錯誤或者改變JSON來JSON對象(例如{ 「名稱」:「值「})或更改反序列化類型的數組或類型 我做這樣的:

List<QuestionAndAnswerNewMarge> _QuestionAndAnswerNewMarge = new List<QuestionAndAnswerNewMarge>(); 
string str="[[{\"QID\":1,\"Question\":\"Question\",\"IsMultipel\":0},{\"QID\":2,\"Question\":\"Question\",\"IsMultipel\":1}],[{\"QID\":1,\"A_ID\":1,\"Answer\":\"Answer\"},{\"QID\":1,\"A_ID\":2,\"Answer\":\"Answer\"},{\"QID\":1,\"A_ID\":3,\"Answer\":\"Answer\"},{\"QID\":1,\"A_ID\":3,\"Answer\":\"Answer\"}]]"; 
_QuestionAndAnswerNewMarge = JsonConvert.DeserializeObject<List<QuestionAndAnswerNewMarge>>(str).ToList(); 

public class QuestionAndAnswerNewMarge 
{ 
    public List<QuestionNew> QuestionNew { get; set; } 
    public List<AnswerNew> AnswerNew { get; set; } 

} 
public class QuestionNew 
{ 

    public string QuestionID { get; set; } 
    public string Question { get; set; } 
    public string IsMultiple { get; set; } 
} 
public class AnswerNew 
{ 

    public string QuestionID { get; set; } 
    public string AnswerID { get; set; } 
    public string Answer { get; set; } 
} 
+0

[反序列化JSON與C#(的可能的複製http://stackoverflow.com/questions/7895105/deserialize-json-with -c-sharp) – BWA

+0

您省略了例外的相關部分。如果你研究這一點,你會發現很多解決方案。 – CodeCaster

回答

0

的JSON並不真正排隊你試圖使用類型。你有兩個選擇,取決於你是否可以改變JSON字符串。

如果可以的話,我建議隻手工建立的對象序列化,然後他們。這會以正確的形式輸出Json以供使用,您可以設置生成它的人以使用該格式。

舉個例子,我調整你的對象了一下,創建它的一個實例,重新創建你的數據,然後連載它:

public class QuestionAndAnswerNewMarge 
{ 
    public List<Question> Questions { get; set; } 
    public List<Answer> Answers { get; set; } 
} 

public class Question 
{ 
    public int QuestionID { get; set; } 
    public string QuestionText { get; set; } 
    public bool IsMultiple { get; set; } 
} 
public class Answer 
{ 
    public int QuestionID { get; set; } 
    public int AnswerID { get; set; } 
    public string AnswerText { get; set; } 
} 

JSON:

{ 
    "Questions": [ 
    { 
     "QuestionID": 1, 
     "QuestionText": "Question", 
     "IsMultiple": false 
    }, 
    { 
     "QuestionID": 2, 
     "QuestionText": "Question", 
     "IsMultiple": true 
    } 
    ], 
    "Answers": [ 
    { 
     "QuestionID": 1, 
     "AnswerID": 1, 
     "AnswerText": "Answer" 
    }, 
    { 
     "QuestionID": 1, 
     "AnswerID": 2, 
     "AnswerText": "Answer" 
    }, 
    { 
     "QuestionID": 1, 
     "AnswerID": 3, 
     "AnswerText": "Answer" 
    }, 
    { 
     "QuestionID": 2, 
     "AnswerID": 1, 
     "AnswerText": "Answer" 
    } 
    ] 
} 

如果您正在閱讀的JSON從外部源,然後使用實用程序等json2csharp生成將使用給定的JSON示例反序列化類。

+0

我已經使用替換的方法,但鋼得到同樣的錯誤改變: { 「問題」:[{ 「QID」: 「1」, 「問題」: 「問題」, 「IsMultipel」: 「0」},{ 「QID」 : 「2」, 「問題」: 「問題」, 「IsMultipel」: 「1」}], 「回答」:[{ 「QID」: 「1」, 「A_ID」: 「1」, 「回答」:」回答 「},{」 QID 「:」 1" , 「A_ID」: 「2」, 「回答」: 「應答」},{ 「QID」: 「1」, 「A_ID」: 「3」, 「回答」 : 「接聽」},{ 「QID」: 「1」, 「A_ID」: 「3」, 「回答」: 「應答」}]} – Vaishnav

+0

@Vaishnav這不是有效的JSON。點擊此處查看:http://jsonlint.com/ – asawyer

0

該解決方案是一個有點髒,但應與JSON字符串工作,你貼

public void Convert() 
    { 
     var questionsAnswers = new QuestionsAnswers() 
     { 
      Answers = new List<Answ>(), 
      Questions = new List<Qst>() 
     }; 


     string str = "[[{\"QID\":1,\"Question\":\"Question\",\"IsMultipel\":0},{\"QID\":2,\"Question\":\"Question\",\"IsMultipel\":1}],[{\"QID\":1,\"A_ID\":1,\"Answer\":\"Answer\"},{\"QID\":1,\"A_ID\":2,\"Answer\":\"Answer\"},{\"QID\":1,\"A_ID\":3,\"Answer\":\"Answer\"},{\"QID\":1,\"A_ID\":3,\"Answer\":\"Answer\"}]]"; 
     var d = JsonConvert.DeserializeObject<dynamic[][]>(str); 
     foreach (var objects in d) 
     { 
      if (objects.All(a => a["A_ID"] == null)) 
      { 
       questionsAnswers.Questions.AddRange(objects.Select(a => new Qst() 
       { 
        IsMultipel = a[nameof(Qst.IsMultipel)], 
        Question = a[nameof(Qst.Question)], 
        QID = a[nameof(Qst.QID)] 
       })); 
      } 
      else 
      { 
       questionsAnswers.Answers.AddRange(objects.Select(a => new Answ() 
       { 
        A_ID = a[nameof(Answ.A_ID)], 
        Answer = a[nameof(Answ.Answer)], 
        QID = a[nameof(Answ.QID)] 
       })); 
      } 
     } 
    } 

    public class QuestionsAnswers 
    { 
     public List<Qst> Questions { get; set; } 
     public List<Answ> Answers { get; set; } 
    } 

    public class Qst 
    { 
     public int QID { get; set; } 
     public string Question { get; set; } 
     public bool IsMultipel { get; set; } 
    } 

    public class Answ 
    { 
     public int QID { get; set; } 
     public int A_ID { get; set; } 
     public string Answer { get; set; } 
    } 
0

您可以使用此。請注意,您需要在類更新您的屬性名稱和類型:

private void Test() 
    { 
     QuestionAndAnswerNewMarge q = new QuestionAndAnswerNewMarge(); 

     JArray ja = JArray.Parse(json); 

     var ja1 = JArray.Parse(ja[0].ToString()); 
     var ja2 = JArray.Parse(ja[1].ToString()); 

     q.QuestionNew = JsonConvert.DeserializeObject<List<QuestionNew>>(ja1.ToString()); 
     q.AnswerNew = JsonConvert.DeserializeObject<List<AnswerNew>>(ja2.ToString()); 
    } 

    public class QuestionAndAnswerNewMarge 
    { 
     public List<QuestionNew> QuestionNew { get; set; } 
     public List<AnswerNew> AnswerNew { get; set; } 
    } 
    public class QuestionNew 
    { 
     public int QID { get; set; } 
     public string Question { get; set; } 
     public int IsMultiple { get; set; } 
    } 
    public class AnswerNew 
    { 
     public string QID { get; set; } 
     public string A_ID { get; set; } 
     public string Answer { get; set; } 
    } 
相關問題