Десериализация JSONObject не десериализуется - PullRequest
0 голосов
/ 29 августа 2018

Это ставит меня в тупик. Вот мои упрощенные определения класса C #:

public class Countries
{
    string TotalCount { get; set; }
    public List<Ctry> Country { get; set; }
}
public class Ctry
{
    string CountryId { get; set; }
    string CountryName { get; set; }
}

Выполненный мной вызов REST завершается успешно и возвращает следующий JSON, который я вижу в переменной content:

{"TotalCount":1,"Country":[{"CountryId":1,"CountryName":"USA"}]}

Вот мой код десериализации c #:

var content = response.Content;
countryList =  JsonConvert.DeserializeObject<Countries>(content);

После десериализации, я ожидаю, что данные страны будут в объекте countryList. Однако в countryList данные не отображаются! Что дает? Никаких исключений или ошибок!

1 Ответ

0 голосов
/ 29 августа 2018

Ваша проблема в том, что JSON.NET по умолчанию использует имена свойств в случае верблюда. Это то, что ваш код ищет по умолчанию:

{"country":[{"countryId":"1","countryName":"USA"}]}

Вам необходимо вручную объявить имена свойств JSON.NET для вашей модели:

public class Countries
{
    [JsonProperty(PropertyName = "TotalCount")]
    string TotalCount { get; set; }

    [JsonProperty(PropertyName = "Country")]
    public List<Ctry> Country { get; set; }
}
public class Ctry
{
    [JsonProperty(PropertyName = "CountryId")]
    string CountryId { get; set; }

    [JsonProperty(PropertyName = "CountryName")]
    string CountryName { get; set; }
}

Я проверил это, и оно работает с вашими данными.

В качестве примечания я объявил все имена свойств, потому что мне нравится поддерживать ручное управление сериализацией и десериализацией, в вашем случае вы могли бы пропустить это, просто объявив несколько слов.

Это также можно исправить, настроив уровень защиты для своих свойств, если вы не хотите вручную определять имена свойств:

public class Countries
{
    public string TotalCount { get; set; }
    public List<Ctry> Country { get; set; }
}
public class Ctry
{
    public string CountryId { get; set; }
    public string CountryName { get; set; }
}

Таким образом, JSON.NET может автоматически сопоставлять имена свойств, если они общедоступны.

@ Tom W - JSON.NET автоматически преобразует типы, когда это возможно, int в строку и string в int - это хорошо.

...