在json中反序列化嵌套列表的最佳方法 - C#
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在json中反序列化嵌套列表的最佳方法 - C#相关的知识,希望对你有一定的参考价值。
我得到了这个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);
}
但我不知道,我认为这离优雅太远了。有没有更好的方法呢?谢谢。 :)
答案
为响应创建一个包装类。
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()
方法中调用该调用,并在调用构造函数后调用它。
另一答案
一般来说,你永远不需要反序列化两次。最简单的解决方案是创建一个类来表示JSON的最外层部分,然后反序列化为@Alex Wiese's answer中所示。
如果你想在没有根类的情况下反序列化,那么你可以在反序列化到ToObject<T>()
之后使用JObject
方法。
JObject jsonResponse = JsonConvert.DeserializeObject<JObject>(jsonResponseString);
Countries = jsonResponse["CountriesAndCities"].ToObject<List<Country>>();
以上是关于在json中反序列化嵌套列表的最佳方法 - C#的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Gson @SerializedName 注释在 Kotlin 中反序列化嵌套的 Json API 响应
jQuery/ASMX:在 C# 中反序列化 JSON 时出错