Проблема с десериализацией сгруппированных данных (json) - PullRequest
0 голосов
/ 03 мая 2019

У меня проблема (кажется базовой) с отображением десериализованных данных JSON в datagridview.

У меня есть простой Person класс:

class Person
{
    public int age { get; set; }
    public string name { get; set; }
    public string school { get; set; }     
}

И список из пяти человек:

Person p1 = new Person() { age = 12, name = "Peter", school = "s1" };
Person p2 = new Person() { age = 13, name = "Jack", school = "s2" };
Person p3 = new Person() { age = 14, name = "William", school = "s2" };
Person p4 = new Person() { age = 15, name = "Emily", school = "s2" };
Person p5 = new Person() { age = 16, name = "Sophie", school = "s1" };
List<Person> persons = new List<Person>() { p1, p2, p3, p4, p5 };

и группировка в этом списке:

var result = from n in persons group n by n.school;

Тогда ( проблема здесь ) у меня есть процесс сериализации / десериализации:

var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(result);
var deserialized = Newtonsoft.Json.JsonConvert.DeserializeObject(serialized);

И, к сожалению, я не могу показать десериализованный результат (в данном примере это "s1" и "s2") в datagridview:

//failed! :(
dataGridView1.DataSource = deserialized;

Где проблема? Примечание 1: это простая демонстрация моей проблемы. в реальной программе у меня нет доступа к «лицам». и имена полей (возраст, имя, школа, ...) неизвестны. все, что у меня есть, это сериализованные данные (форма переменной «result»). другими словами, переменная «result» - это черный ящик. Примечание2: Насколько я знаю, проблема возникает только в сгруппированных данных. так что все будет хорошо, если «результат» (черный ящик) не содержит группировки. но моя проблема в десериализации сгруппированных данных.

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Ваша проблема здесь в том, что вы не указываете требуемый тип десериализации.

 Newtonsoft.Json.JsonConvert.DeserializeObject<List<List<Person>>>(serialized)

, и это должно сработать

0 голосов
/ 03 мая 2019

Предложение Налнпира верно. Вам нужно будет указать порядок типов для десериализации json. Вы пытались создать источник привязки и задать источник данных в виде списка?

var list = JsonConvert.DeserializeObject<List<Person>>(serialized)
var bindingSource = new BindingSource();
bindingSource.DataSource = list;
dataGridView1.DataSource = bindingSource;

...