JSON.NET «System.OutOfMemoryException» при десериализации в набор данных

1

Очень новый для С# и 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);
  • 0
    Вы уверены, что используете последнюю версию JSON.NET? Похоже, это может быть ошибка.
  • 1
    {"seconds_ago":"1", "items":[{"id":"1122267","quantity":"1","bundle":"1"}]} ли {"seconds_ago":"1", "items":[{"id":"1122267","quantity":"1","bundle":"1"}]} ? А как насчет {"seconds_ago":"1"} ?
Теги:
json.net

2 ответа

3
Лучший ответ

Я не совсем знаком с 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);
  • 0
    Десериализация в объект C #, кажется, работает. Но мне тяжело смотреть на содержимое. Например, Console.WriteLine(RootObject.seconds_ago); выходит из строя. В идеале я хотел бы показать данные в datagridview. Используя мой оригинальный метод, я мог просто связать таблицу данных с dataGridView1.DataSource = dataTable; данных, используя dataGridView1.DataSource = dataTable; , Я предполагаю, что мне придется зацикливаться и писать в сетку? Любые примеры будут наиболее полезными. Спасибо
  • 0
    @Tiago Как это не удается? Ваша оригинальная строка json содержала значение для seconds_ago ? Если seconds_ago является строкой и ваши данные json не содержат такого значения, RootObject.seconds_ago вернет RootObject.seconds_ago .
Показать ещё 5 комментариев
0

Класс DataSet не имеет свойства seconds_ago или items. И потому

DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(json);

Никогда не будет работать, потому что вы не можете преобразовать эту конкретную строку json в DataSet

  • 3
    Вы предполагаете, что он использует встроенный DataSet.
  • 0
    Хороший вопрос .... давайте посмотрим

Ещё вопросы

Сообщество Overcoder
Наверх
Меню