Очень новый для С# и JSON. Я борюсь с этой проблемой около дня и не могу понять это.
JSONLint утверждает, что строки JSON действительны.
Попытка десериализации следующих
{"items":[{"id":"1122267","quantity":"1","bundle":"1"}],"seconds_ago":"1"}
выбрасывает исключение
Необработанное исключение типа "System.OutOfMemoryException" произошло в Newtonsoft.Json.dll
Если я попробую
{"items":[{"id":"1122267","quantity":"1","bundle":"1"}]}
оно работает.
Я читаю строку JSON из текстового поля и затем десериализую, используя следующие
string json = textBox1.Text;
DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(json);
Я не совсем знаком с DataSet, но, немного поиграв с ним, я думаю, что нашел причину. Согласно документации:
DataSet состоит из набора объектов DataTable
Поскольку DataSet представляет собой набор объектов, вы можете только десериализовать коллекцию (массив) в нее. Так,
{"items":[{"id":"1122267","quantity":"1","bundle":"1"}],"seconds_ago":"1"}
не будет работать, потому что он содержит одну коллекцию (items
) и одно свойство (seconds_ago
). С другой стороны,
{"items":[{"id":"1122267","quantity":"1","bundle":"1"}]}
работает, потому что он содержит только одну коллекцию.
Поэтому, если вы действительно хотите десериализовать свою json-строку в DataSet, вы должны сделать это вместо этого:
{
"objects": [
{
"items":[{"id":"1122267","quantity":"1","bundle":"1"}],
"seconds_ago":"1"
}
]
}
Вы действительно должны рассматривать десериализацию в объект С#, хотя, на мой взгляд, менее сложный и простой в обращении:
public class RootObject
{
public List<Item> items { get; set; }
public string seconds_ago { get; set; }
}
public class Item
{
public string id { get; set; }
public string quantity { get; set; }
public string bundle { get; set; }
}
RootObject deserializedObject = JsonConvert.DeserializeObject<RootObject>(json);
Console.WriteLine(RootObject.seconds_ago);
выходит из строя. В идеале я хотел бы показать данные в datagridview. Используя мой оригинальный метод, я мог просто связать таблицу данных с dataGridView1.DataSource = dataTable;
данных, используя dataGridView1.DataSource = dataTable;
, Я предполагаю, что мне придется зацикливаться и писать в сетку? Любые примеры будут наиболее полезными. Спасибо
seconds_ago
? Если seconds_ago
является строкой и ваши данные json не содержат такого значения, RootObject.seconds_ago
вернет RootObject.seconds_ago
.
Класс DataSet
не имеет свойства seconds_ago
или items
. И потому
DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(json);
Никогда не будет работать, потому что вы не можете преобразовать эту конкретную строку json в DataSet
{"seconds_ago":"1", "items":[{"id":"1122267","quantity":"1","bundle":"1"}]}
ли{"seconds_ago":"1", "items":[{"id":"1122267","quantity":"1","bundle":"1"}]}
? А как насчет{"seconds_ago":"1"}
?