如何从RestCountries API的JSON中正确获取含名称和人口的国家列表?
解决方案
问题核心是System.Text.Json的JsonPropertyName特性不支持通过点分隔符(如name.official)直接映射嵌套JSON属性,它仅能指定当前层级的属性名,无法跨层级引用嵌套对象里的字段。
方案一:按JSON嵌套结构定义DTO
根据RestCountries返回的JSON结构,创建对应嵌套类来匹配层级:
public class CountryDTO { [JsonPropertyName("name")] public NameInfo NameInfo { get; set; } [JsonPropertyName("population")] public int Population { get; set; } // 嵌套类对应JSON中的name对象 public class NameInfo { [JsonPropertyName("official")] public string OfficialName { get; set; } } }
使用时直接通过country.NameInfo.OfficialName获取正式国名即可。
方案二:用属性包装器隐藏嵌套层级
如果希望在DTO外层直接拿到正式名称,可以通过私有嵌套类+包装属性实现:
public class CountryDTO { [JsonPropertyName("name")] private NameInfo _nameInfo { get; set; } [JsonPropertyName("population")] public int Population { get; set; } // 对外暴露的正式名称属性,自动从嵌套对象取值 public string OfficialName => _nameInfo?.OfficialName ?? string.Empty; private class NameInfo { [JsonPropertyName("official")] public string OfficialName { get; set; } } }
这种方式既匹配了JSON结构,又能直接通过country.OfficialName获取名称,无需额外处理嵌套层级。
反序列化代码保持不变
原有的反序列化逻辑无需修改,现在可以正确映射正式国名和人口:
string json = await _httpClient.GetStringAsync("https://restcountries.com/v3.1/all"); List<CountryDTO>? countries = JsonSerializer.Deserialize<List<CountryDTO>>(json);
提示:如果存在JSON中
name字段为null的极端情况,建议在包装属性中加入空值判断,避免空引用异常。
内容的提问来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

