Десериализация JSON в объект

c# json json.net

14607 просмотра

1 ответ

116836 Репутация автора

У меня есть немного JSON:

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

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

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

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

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

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

Автор: CodeCaster Источник Размещён: 11.12.2015 11:32

Ответы (1)


21 плюса

116836 Репутация автора

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

Автор: CodeCaster Размещён: 11.12.2015 11:32
32x32