Я знаю, что это поздно, но мне понадобилось 2 минуты, чтобы написать эту оптимизированную и улучшенную версию ответа AgileJon:
var key, obj, prop, owns = Object.prototype.hasOwnProperty;
for (key in validation_messages ) {
if (owns.call(validation_messages, key)) {
obj = validation_messages[key];
for (prop in obj ) {
// using obj.hasOwnProperty might cause you headache if there is
// obj.hasOwnProperty = function(){return false;}
// but owns will always work
if (owns.call(obj, prop)) {
console.log(prop, "=", obj[prop]);
}
}
}
}
Что JSON не является массивом Foo
JSON. Код JsonConvert.DeserializeObject<T>(jsonString)
будет разбирать строку JSON от корня вверх, а ваш тип T
должен точно соответствовать этой структуре JSON. Синтаксический анализатор не собирается гадать , член JSON должен представлять List<Foo>
, который вы ищете.
Вам нужен корневой объект, представляющий 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.