【发布时间】:2021-09-14 11:09:53
【问题描述】:
我遇到的问题是如何反序列化以下 JSON。 Answer 的值有时为 NULL、true、整数、布尔值或包含另一个 JSON 列表(id、描述等)。
我做的第一步是在 Visual Studio 中复制并粘贴 special as class。这为我提供了以下问题类。
然后我尝试反序列化它(遵循 C# - rawResponse 是 JSON)。但是,我得到“Newtonsoft.Json.JsonSerializationException:'无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 Applicated.Questions,因为该类型需要 JSON 对象(例如 {"name":"value "}) 正确反序列化....“
我知道这与映射不正确有关。
因此,尝试通过将响应保存在动态变量中来将所有这些都放在 foreach 循环中(请注意,我确实为此从 Questions 类中删除了 Property1)。但是,Answer 中的某些结果会将字符串 Id、Description 等存储在 Answer 字段中。有没有更简单的方法,我好像遇到了心理障碍?
JSON:
[
{
"Answer": true,
"QuestionId": 55,
"Title": "Are you Married?",
"AnswerType": "Boolean"
},
{
"Answer": {
"Id": "1",
"Description": "Female",
"Reference": "F",
"ArchiveDate": null,
"ParentId": null,
"OptionType": {
"Id": 40,
"Type": "dropdown"
}
},
"QuestionId": 778,
"Title": "Gender",
"AnswerType": "Option”
}
]
类:
public class Questions
{
public Class1[] Property1 { get; set; }
}
public class Class1
{
public object Answer { get; set; }
public int QuestionId { get; set; }
public string Title { get; set; }
public string AnswerType { get; set; }
}
C#:
Questions result = JsonConvert.DeserializeObject<Questions>(rawResponse);
C# 动态 Foreach
dynamic result = JsonConvert.DeserializeObject(rawResponse);
var lstQuestionObjects = new List<Questions>();
foreach(var obj in result)
{
lstQuestionObjects.Add(new Questions()
{
Answer = (obj.Answer !=null) ? obj.Answer.ToString() :"",
QuestionId = int.Parse(obj.QuestionId.ToString()),
Title = (obj.Title != null) ? obj.Title.ToString() : "",
AnswerType = (obj.AnswerType != null) ? obj.AnswerType.ToString() : ""
});
}
【问题讨论】:
-
您是否构建了这个 JSON,您是否愿意接受轻微的结构更改以使其更容易?
-
不,不幸的是,这就是我需要从中提取数据的 API 中数据的存放方式。如果由我决定,数据就不会保持原样。因此,我面临的问题。
标签: c# json deserialization