2016-09-15 2 views
-3

Как преобразовать JSON массив в список <> C#Преобразовать JSON в список <> с #

[[{ 
    "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", "Question": "Question", "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

@ Вайшнав Это недопустимо 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; } 
    } 
Смежные вопросы