C# Десериализовать два объекта Jarray в один объект - PullRequest
1 голос
/ 01 августа 2020

У меня есть внешний 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 и сопоставить заголовки и данные в JArray. В настоящее время я десериализую его в APIResponse.cs, используя этот код:

var jsonResponse = JsonConvert.DeserializeObject (json .ToString ());

public class ApiResponse
{
    public JArray Data { get; set; }
    public JArray Headers { get; set; }
}

Поэтому я бы хотел, чтобы мои заголовки и данные были десериализованы в объекте Student. Есть предположения? Цените вашу помощь.

Спасибо!

1 Ответ

1 голос
/ 01 августа 2020

Для этого необходимо выполнить следующие шаги:

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 вы можете получить свою коллекцию Student:

var studentCollection = deserializedObj.Responses[0].Data;

Обновленный ответ

4- Получить данные о сборе учеников в списке типов учеников:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...