You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:03:14