在json中反序列化嵌套列表的最佳方法 - C#

问题描述 投票:4回答:2

我得到了这个Json:

{
    "CountriesAndCities": [
        {
            "CountryId": 2,
            "CountryName": "Chile",
            "CountryISOA3": "CHL",
            "Cities": [
                {
                    "CityId": 26,
                    "CityName": "Gran Santiago",
                    "Country": null
                },
                {
                    "CityId": 27,
                    "CityName": "Gran Concepción",
                    "Country": null
                }
            ]
        }
    ]
}

如您所见,它是一个对象列表,这些对象嵌套了另一个列表。

我有这些型号:

public class City
    {
        public int CityId { get; set; }
        public string CityName { get; set; }
        public Country Country { get; set; }
    }

    public class Country
    {
        public int CountryId { get; set; }
        public string CountryName { get; set; }
        public string CountryISOA3 { get; set; }
        public ICollection<City> Cities { get; set; }
    }

现在,这可以解决问题:

public ICollection<Country> Countries { get; set; }

        public RegionViewModel()
        {
            // Pidiendo las ciudades al backend.
            S3EWebApi webApi = new S3EWebApi();
            HttpResponseMessage response = webApi.Get("/api/Benefits/GetCountriesAndCities");
            string jsonResponseString = response.Content.ReadAsStringAsync().Result;
            JObject jsonResponse = JsonConvert.DeserializeObject<JObject>(jsonResponseString);

            string countriesAndCitiesJSon = jsonResponse["CountriesAndCities"].ToString();
            Countries = JsonConvert.DeserializeObject<List<Country>>(countriesAndCitiesJSon);
        }

但我不知道,我认为这离优雅太远了。有没有更好的方法呢?谢谢。 :)

c# json json.net
2个回答
4
投票

为响应创建一个包装类。

public class CountriesAndCitiesResponse
{
    public List<Country> CountriesAndCities { get; set; }
}

然后像这样使用它:

public RegionViewModel()
{
    // Pidiendo las ciudades al backend.
    S3EWebApi webApi = new S3EWebApi();
    HttpResponseMessage response = webApi.Get("/api/Benefits/GetCountriesAndCities");
    string jsonResponseString = response.Content.ReadAsStringAsync().Result;
    CountriesAndCitiesResponse response = JsonConvert.DeserializeObject<CountriesAndCitiesResponse>(jsonResponseString);

    Countries = response.CountriesAndCities;
}

你还应该重新考虑在构造函数中调用async方法(它可能导致死锁)。您可以考虑在async Task Load()方法中调用该调用,并在调用构造函数后调用它。


3
投票

一般来说,你永远不需要反序列化两次。最简单的解决方案是创建一个类来表示JSON的最外层部分,然后反序列化为@Alex Wiese's answer中所示。

如果你想在没有根类的情况下反序列化,那么你可以在反序列化到ToObject<T>()之后使用JObject方法。

JObject jsonResponse = JsonConvert.DeserializeObject<JObject>(jsonResponseString);
Countries = jsonResponse["CountriesAndCities"].ToObject<List<Country>>();
© www.soinside.com 2019 - 2024. All rights reserved.