2014-06-19 3 views
0

Я пытаюсь десериализовать объект, тип заселен, но я получаю null для List<Sport>. Есть идеи?десериализация объекта с общим списком

Мои классы:

class Sports 
{ 
    public MsgTypes type { get; set; } 
    public List<Sport> Sport { get; set; } 
} 

class Sport 
{ 
    public int Id { get; set; } 
    public int Import_id { get; set; } 
    public string Name { get; set; } 
    public int Active { get; set; } 
    public int Order { get; set; } 
    public int Min_bet { get; set; } 
    public int Max_bet { get; set; } 
    public int Updated { get; set; } 
    public string Feed_type { get; set; } 
    public string Locale { get; set; } 
} 

Команда для десериализации:

Sports _sports = (Sports) JsonConvert.DeserializeObject<Sports>(jsonObj); 

Это мой JSON объект:

"{\"code\":0,\"type\":4,\"Sports\":[{\"Sport\":{\"id\":\"1\",\"import_id\":\"1\",\"name\":\"Soccer\",\"active\":true,\"order\":\"1\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403194889\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"2\",\"import_id\":\"5\",\"name\":\"Tennis\",\"active\":true,\"order\":\"3\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403194771\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"3\",\"import_id\":\"6\",\"name\":\"Handball\",\"active\":true,\"order\":\"6\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403152901\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"4\",\"import_id\":\"4\",\"name\":\"Ice Hockey\",\"active\":true,\"order\":\"4\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403080245\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"7\",\"import_id\":\"2\",\"name\":\"Basketball\",\"active\":true,\"order\":\"2\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403194830\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"8\",\"import_id\":\"23\",\"name\":\"Volleyball\",\"active\":true,\"order\":\"5\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403194591\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"9\",\"import_id\":\"12\",\"name\":\"Rugby\",\"active\":true,\"order\":\"7\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403194710\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"12\",\"import_id\":\"11\",\"name\":\"Motorsport\",\"active\":true,\"order\":\"12\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403065699\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"13\",\"import_id\":\"3\",\"name\":\"Baseball\",\"active\":true,\"order\":\"13\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403194834\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"14\",\"import_id\":\"16\",\"name\":\"American Football\",\"active\":true,\"order\":\"14\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403143326\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}},{\"Sport\":{\"id\":\"16\",\"import_id\":\"34\",\"name\":\"Beach Volley\",\"active\":true,\"order\":\"16\",\"min_bet\":\"0\",\"max_bet\":\"0\",\"updated\":\"1403194417\",\"feed_type\":\"Betradar\",\"locale\":\"en_us\"}}]}" 
+0

Похоже, это JSON не является действительным. – Anuraj

+1

Я думаю, что ваш 'List ' в 'Sports' должен быть назван' Sports', а не 'Sport' –

+0

@ChrisMantie: имя класса не может быть таким же, как имя свойства внутри этого класса;) Этот спортивный класс выглядит довольно странно вообще. Я бы либо ожидал, что какой-либо другой объект получит коллекцию . Что означает спорт? –

ответ

0

Вам нужно еще один уровень вложенности и различных имен классов , Вы должны быть в состоянии десериализации в такую ​​структуру:

class SportsParent 
{ 
    //Code for MsgTypes was not provided so it is commented out 
    public List<SportGroup> Sports { get; set; } 
} 

class SportGroup 
{ 
    public SportItem Sport { get; set; } 
} 

class SportItem 
{ 
    public int Id { get; set; } 
    public int Import_id { get; set; } 
    public string Name { get; set; } 
    public bool Active { get; set; } //need to be converted to bool instead of int 
    public int Order { get; set; } 
    public int Min_bet { get; set; } 
    public int Max_bet { get; set; } 
    public int Updated { get; set; } 
    public string Feed_type { get; set; } 
    public string Locale { get; set; } 
} 

Вы можете десериализации с помощью такого кода:

SportsParent _sports = JsonConvert.DeserializeObject<SportsParent>(jsonObj); 
+0

Спасибо за ваш ответ, это действительно сработало :) Но я действительно не понимаю, зачем нужен дополнительный уровень вложенности. Не могли бы вы объяснить это? – user3757324

+0

Trimmed версия вашего сериализованного json выглядит так: {«Спорт»: [{«Спорт»: {"id": "1",}}]}. Это означает, что у вас есть объект, который имеет свойство списка Sports (это класс SportsParent и свойство Sports). Каждый элемент массива представлен {"Спорт": {"id": "1",}}, который указывает одно свойство Sport (в коде, которое является классом SportGroup), а фактические данные находятся внутри этого объекта (класс SportItem). Я надеюсь, что это имеет смысл – dotnetom

+0

Да, да, спасибо. – user3757324

Смежные вопросы