Эта строка JSON не будет десериализована [дубликат]

В соответствии с ECMAScript 5 вы можете комбинировать Object.keys() и Array.prototype.forEach():

var obj = {
  first: "John",
  last: "Doe"
};

//
//	Visit non-inherited enumerable keys
//
Object.keys(obj).forEach(function(key) {

  console.log(key, obj[key]);

});

7
задан Brian Rogers 12 January 2016 в 17:35
поделиться

1 ответ

Что 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.

19
ответ дан CodeCaster 26 August 2018 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: