получить сборку массива JSON return from webhook c # [duplicate]

Я знаю, что это поздно, но мне понадобилось 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]);
            }

        }

    }

}
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 в 19:01
поделиться
Другие вопросы по тегам:

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