2015-12-11 6 views
7

У меня есть JSON:десериализации JSON в объект

{ 
    "foo" : [ 
     { "bar" : "baz" }, 
     { "bar" : "qux" } 
    ] 
} 

И я десериализации это в коллекции. Я определил этот класс:

public class Foo 
{ 
    public string bar { get; set; } 
} 

Однако, следующий код не работает:

JsonConvert.DeserializeObject<List<Foo>>(jsonString); 

Как я могу десериализации мой JSON?

+2

Это означает канонический вопрос для _ «Почему эта десериализация не работает» _ и должна показывать общий рабочий процесс, за которым могли бы следовать люди. Не стесняйтесь отвечать, улучшать и использовать в качестве дублирующей цели. – CodeCaster

ответ

17

Это JSON не является массивом JSON Foo. Код JsonConvert.DeserializeObject<T>(jsonString) проанализирует строку JSON от корня до, и ваш тип T должен точно соответствовать структуре JSON. Парсер не собирается гадать который Член JSON должен представлять List<Foo>, которого вы ищете.

Вам нужен объект root, представляющий JSON из корневого элемента.

Вы можете легко позволить классам, которые должны быть созданы из образца JSON. Для этого скопируйте свой JSON и нажмите Edit -> Paste Special -> Paste JSON As Classes в Visual Studio.

В качестве альтернативы вы можете сделать то же самое на http://json2csharp.com, который генерирует более или менее одинаковые классы.

Вы увидите, что коллекция на самом деле один элемент глубже, чем ожидалось:

public class Foo 
{ 
    public string bar { get; set; } 
} 

public class RootObject 
{ 
    public List<Foo> foo { get; set; } 
} 

Теперь вы можете десериализации JSON от корня (и обязательно переименовывать RootObject к чему-то полезное):

var rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString); 

и доступ к коллекции:

foreach (var foo in rootObject.foo) 
{ 
    // foo is a `Foo` 

} 

Вы можете аль способы переименовать свойства следовать вашей конвенции обсадных и применить атрибут JsonProperty к ним:

public class Foo 
{ 
    [JsonProperty("bar")] 
    public string Bar { get; set; } 
} 

Также убедитесь, что JSON содержит достаточное количество данных выборки. Парсер класса должен угадать соответствующий тип C# на основе содержимого, содержащегося в JSON.

+0

Спасибо @CodeCaster. Хотя я не мог найти специальный параметр вставки в VS2010 или VS2017, предоставленная ссылка выполнила эту работу. Вау. Хотел бы я знать об этом сайте раньше. СПАСИБО! – err1

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