Я использую 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, как мне это исправить ??
Спасибо
Это не плоская структура строк/столбцов, поэтому я не уверен, каким, по вашему мнению, был бы ожидаемый результат, если бы вы смогли поместить его в таблицу? Вам нужно десериализовать его до типа (или набора типов), который фактически соответствует структуре JSON. Такой инструмент, как json2csharp.com, на самом деле создаст их для вас (обычно очень точно), если вы вставите в JSON
Использование DataSet/DataTable/DataView должно осуществляться с осторожностью — оно часто используется как дырявая абстракция для представления информации. У них есть свое применение, но слишком часто ими злоупотребляют. В большинстве случаев лучше определить классы, которые представляют информацию, которую вам нужно передать.
Это недопустимый формат для DataSet, он довольно специфичен. Вы можете создать оболочку для данных или пользовательский тип для десериализации объекта. Скорее всего, вы захотите сделать это последним, а затем вы сможете реализовать любые методы, которые вам понадобятся для форматирования данных во все, что вы пытаетесь загрузить.





Попробуйте использовать этот класс в качестве принимающего класса
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 Я не знаю, с какой целью он использует DataSet, но может быть, он нужен ему для использования возможностей ADO.NET или чего-то еще, поэтому дополнительный переход к объекту должен избежать ошибок на объектах, которые вам не нужны. иметь полный контроль над. Таким образом, он может десериализовать пользовательский объект, а затем заполнить набор данных данными.
Гораздо более вероятно, что DataSet не нужен для любого варианта использования, учитывая, как мало допустимых применений. Я просто не хочу, чтобы ваш ответ создавал ложное впечатление, что набор данных каким-то образом является необходимой частью решения.
Вы можете использовать UDT с ADO.NET.
Это часть решения, поскольку пользователь специально просит использовать набор данных. Если бы он спросил: «С набором данных все в порядке или я могу сделать это по-другому?» тогда у вас будет точка. В любом случае, если он поймет, что ему не нужен набор данных, ну, я не знаю, лол
Похоже, он доступен только для SQL Server, но для него есть некоторая документация, хотя он не очень хорош связь. Теперь я начинаю задаваться вопросом, нужен ли ему ADO вообще, поскольку он загружает json из того, что я предполагаю, это служба REST.
@TheBatman Я использовал их на сервере SQL, но возвращал их через Entity Framework, который автоматически сопоставлял их с объектами. Затем я обслуживал их с помощью API. Никогда не знал, что они доступны в ADO.NET, на стороне кода
@LiquidCore Тот факт, что ОП спросил о наборе данных, не означает, что он действительно нужен им. Возможно, они просто сделали неверное предположение. Я постоянно вижу вопросы с такого рода неуместными предположениями, встроенными в них. Я согласен с Бэтменом, я не понимаю, как это поможет задействовать набор данных... в контексте показанной структуры данных это не имеет никакого смысла.
Жидкое ядро
Спасибо за определения классов, это то, что я искал.
Что касается обсуждения моего комментария к набору данных, они верны, мне не нужен набор данных. В основном я работаю с данными SQL, поэтому я привык использовать наборы данных в проектах WinForms для представления своих данных. Как только я загрузил свой класс Dataum, я просто назначил источник данных массиву.
я бы создал собственный класс для этой информации.