C# 在单个对象中反序列化两个 Jarray 对象
Posted
技术标签:
【中文标题】C# 在单个对象中反序列化两个 Jarray 对象【英文标题】:C# Deserialize Two Jarray Objects in Single Object 【发布时间】:2020-11-21 21:48:37 【问题描述】:我有一个以这种格式返回响应的外部 API:
"responses": [
"columnHeadersCount": 1,
"data": [
[
"1",
"John",
"Smith",
"50"
],
[
"2",
"Liam",
"Miller",
"10"
]
],
"headerOrientation": "horizontal",
"headers": [
[
"displayName": "Id"
,
"displayName": "First Name",
"field": "FirstNameField"
,
"displayName": "Last Name",
"field": "LastNameField"
,
"displayName": "Age",
"field": "AgeField"
]
],
"totalColumnsCount": 4
]
我有一个类,我希望将 API 响应反序列化为
Student.cs
public class Student
public int Id get; set;
[JsonProperty("firstName")]
public string FirstName get; set;
[JsonProperty("lastName")]
public string LastName get; set;
public int Age get; set;
我的问题是,鉴于我拥有的 API 响应的结构,我如何将响应反序列化到此类中?
我尝试创建一个名为 APIResponse.cs 的类并将 Headers 和 Data 映射到 JArray。目前,我使用以下代码将其反序列化为 APIResponse.cs:
var jsonResponse = JsonConvert.DeserializeObject(json.ToString());
public class ApiResponse
public JArray Data get; set;
public JArray Headers get; set;
所以我希望我的标题和数据在学生对象中反序列化。 有什么想法吗?感谢您的帮助。
谢谢!
【问题讨论】:
Json 看起来很脏。你能粘贴真正的有效载荷吗谢谢。这也不是一个有效的 C# 类。 专业提示尽量不要让人们更努力地工作,需要阅读、测试并为您提供解决方案 给定的 JSON 数据格式不正确。提供正确的 Json 数据 @TheGeneral 我已经更新了上面的 JSON。谢谢 @Imran 谢谢,我的错,我在上面提供了正确的 JSON 首先,不要这样做:[JsonProperty("First Name")]
——这不是一个有效的 JSON 属性名称。应该是[JsonProperty("firstName")]
【参考方案1】:
为此,您必须按照以下步骤操作:
1-创建以下类来反序列化对象中的数据。
public class MainClass
public List<Response> Responses get; set;
public class Response
public long ColumnHeadersCount get; set;
public List<List<string>> Data get; set;
public string HeaderOrientation get; set;
public List<List<Header>> Headers get; set;
public long TotalColumnsCount get; set;
public class Header
public string DisplayName get; set;
public string Field get; set;
2- 反序列化您的 Json 字符串,如下所示:
var deserializedObj = JsonConvert.DeserializeObject<MainClass>(YourJsonString);
3- 从此deserializedObj
,您可以获得您的学生收藏:
var studentCollection = deserializedObj.Responses[0].Data;
更新答案
4-获取学生类型列表中的studentCollection数据:
List<Student> student = new List<Student>();
foreach(var item in studentCollection)
var std = new Student()
Id = int.Parse(item[0]),
FirstName = item[1],
LastName = item[2],
Age = int.Parse(item[3])
;
student.Add(std);
【讨论】:
谢谢@Imran,这有帮助!我可以将 studentCollection 作为 ListstudentCollection
后,循环进入Student类型集合。检查它,我将在答案中更新。
是的,谢谢,如果我在 studentCollection 上循环,我看到的唯一警告是当我有大型数据集时,>5000 个项目。
是的,对于大型数据集,它可能会很昂贵,但由于接收 Json 格式,您必须承担它。以上是关于C# 在单个对象中反序列化两个 Jarray 对象的主要内容,如果未能解决你的问题,请参考以下文章
使用 LitJson 在 C# 中反序列化 JSON 对象数组 [重复]