首页 > 解决方案 > C# 在单个对象中反序列化两个 Jarray 对象

问题描述

我有一个以这种格式返回响应的外部 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; }
}

所以我希望我的标题和数据在学生对象中反序列化。有什么想法吗?感谢你的帮助。

谢谢!

标签: c#jsonjson.net

解决方案


为此,您必须按照以下步骤操作:

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);
}

推荐阅读