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