Ошибка при преобразовании JSON в набор данных в C#

Я использую JSON.Net для получения следующих данных в формате JSON.

{"Pagination":{"CurrentPage":1,"PageSize":20,"NumberOfPages":3796,"totalCount":75913},"Data":[{"SalesOrderNumber":"003119"},{"SalesOrderNumber":"003336"},{"SalesOrderNumber":"003410"},{"SalesOrderNumber":"003520"}]}

Я могу успешно получить данные и загрузить их в текстовое поле С#. Что я хочу сделать, так это загрузить его в набор данных. Я использую следующий оператор, чтобы попытаться загрузить набор данных.

DataSet dsSalesOrders = JsonConvert.DeserializeObject<DataSet>(response.Content);

Когда я запускаю программу, я получаю следующую ошибку

Newtonsoft.Json.JsonSerializationException: 'Unexpected JSON token when reading DataTable. Expected StartArray, got StartObject. Path 'Pagination', line 1, position 15.'

Поскольку я впервые использую JSON, как мне это исправить ??

Спасибо

я бы создал собственный класс для этой информации.

Daniel A. White 26.04.2019 21:06

Это не плоская структура строк/столбцов, поэтому я не уверен, каким, по вашему мнению, был бы ожидаемый результат, если бы вы смогли поместить его в таблицу? Вам нужно десериализовать его до типа (или набора типов), который фактически соответствует структуре JSON. Такой инструмент, как json2csharp.com, на самом деле создаст их для вас (обычно очень точно), если вы вставите в JSON

ADyson 26.04.2019 21:09

Использование DataSet/DataTable/DataView должно осуществляться с осторожностью — оно часто используется как дырявая абстракция для представления информации. У них есть свое применение, но слишком часто ими злоупотребляют. В большинстве случаев лучше определить классы, которые представляют информацию, которую вам нужно передать.

mason 26.04.2019 21:13

Это недопустимый формат для DataSet, он довольно специфичен. Вы можете создать оболочку для данных или пользовательский тип для десериализации объекта. Скорее всего, вы захотите сделать это последним, а затем вы сможете реализовать любые методы, которые вам понадобятся для форматирования данных во все, что вы пытаетесь загрузить.

TheBatman 26.04.2019 21:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте использовать этот класс в качестве принимающего класса

public class YourMainObject
{
    public Pagination Pagination { get; set; }
    public Datum[] Data { get; set; }
}

public class Pagination
{
    public int CurrentPage { get; set; }
    public int PageSize { get; set; }
    public int NumberOfPages { get; set; }
    public int totalCount { get; set; }
}

public class Datum
{
    public string SalesOrderNumber { get; set; }
}

и десериализуйте его, а затем заполните набор данных отдельно.

PS: в приведенном ниже обсуждении коллеги-программисты предполагают, что вам, возможно, не нужно использовать DataSet.

«Затем заполните набор данных отдельно», вы имеете в виду полностью пропустить набор данных?

mason 26.04.2019 21:30

@mason Я не знаю, с какой целью он использует DataSet, но может быть, он нужен ему для использования возможностей ADO.NET или чего-то еще, поэтому дополнительный переход к объекту должен избежать ошибок на объектах, которые вам не нужны. иметь полный контроль над. Таким образом, он может десериализовать пользовательский объект, а затем заполнить набор данных данными.

Liquid Core 26.04.2019 21:31

Гораздо более вероятно, что DataSet не нужен для любого варианта использования, учитывая, как мало допустимых применений. Я просто не хочу, чтобы ваш ответ создавал ложное впечатление, что набор данных каким-то образом является необходимой частью решения.

mason 26.04.2019 21:33

Вы можете использовать UDT с ADO.NET.

TheBatman 26.04.2019 21:34

Это часть решения, поскольку пользователь специально просит использовать набор данных. Если бы он спросил: «С набором данных все в порядке или я могу сделать это по-другому?» тогда у вас будет точка. В любом случае, если он поймет, что ему не нужен набор данных, ну, я не знаю, лол

Liquid Core 26.04.2019 21:35

Похоже, он доступен только для SQL Server, но для него есть некоторая документация, хотя он не очень хорош связь. Теперь я начинаю задаваться вопросом, нужен ли ему ADO вообще, поскольку он загружает json из того, что я предполагаю, это служба REST.

TheBatman 26.04.2019 21:39

@TheBatman Я использовал их на сервере SQL, но возвращал их через Entity Framework, который автоматически сопоставлял их с объектами. Затем я обслуживал их с помощью API. Никогда не знал, что они доступны в ADO.NET, на стороне кода

Liquid Core 26.04.2019 21:43

@LiquidCore Тот факт, что ОП спросил о наборе данных, не означает, что он действительно нужен им. Возможно, они просто сделали неверное предположение. Я постоянно вижу вопросы с такого рода неуместными предположениями, встроенными в них. Я согласен с Бэтменом, я не понимаю, как это поможет задействовать набор данных... в контексте показанной структуры данных это не имеет никакого смысла.

ADyson 26.04.2019 21:57

Жидкое ядро

Спасибо за определения классов, это то, что я искал.

Что касается обсуждения моего комментария к набору данных, они верны, мне не нужен набор данных. В основном я работаю с данными SQL, поэтому я привык использовать наборы данных в проектах WinForms для представления своих данных. Как только я загрузил свой класс Dataum, я просто назначил источник данных массиву.

Другие вопросы по теме