[英]Convert json to List<> 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 对象(例如 {"name":"value"})或将反序列化类型更改为数组或我正在执行的类型:
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; }
}
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 示例进行反序列化的类。
这个解决方案有点脏,但应该适用于您发布的 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; }
}
你可以用这个。 请注意,您需要更新类中的属性名称和类型:
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; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.