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

如何使用System.Text.Json反序列化动态键Web API JSON到Indicador类

通用反序列化实现

你遇到的核心问题是API返回的根节点键名随指标类型动态变化,不需要为每个指标单独定义容器类,用JsonDocument做动态解析即可实现通用适配:

通用工具方法

using System.Text.Json;

public class IndicadorParser
{
    private static readonly JsonSerializerOptions _defaultOptions = new JsonSerializerOptions
    {
        PropertyNameCaseInsensitive = true
    };

    /// <summary>
    /// 解析任意指标返回的JSON,返回Indicador集合
    /// </summary>
    public static IEnumerable<Indicador> ParseToList(string json)
    {
        using var doc = JsonDocument.Parse(json);
        // 直接取根节点下第一个属性的值,忽略动态变化的键名
        var arrayElement = doc.RootElement.EnumerateObject().First().Value;
        return JsonSerializer.Deserialize<List<Indicador>>(arrayElement.GetRawText(), _defaultOptions) 
            ?? Enumerable.Empty<Indicador>();
    }

    /// <summary>
    /// 解析单条指标返回的JSON,返回单个Indicador对象
    /// </summary>
    public static Indicador? ParseToSingle(string json)
    {
        var list = ParseToList(json).ToList();
        return list.Count == 0 ? null : list[0];
    }

    /// <summary>
    /// 自动适配返回类型:单条返回对象,多条返回集合
    /// </summary>
    public static object ParseAuto(string json)
    {
        var list = ParseToList(json).ToList();
        return list.Count == 1 ? list[0] : list;
    }
}

调用示例

var dataFromApi = await httpResponse.Content.ReadAsStringAsync();

// 场景1:需要统一用集合接收(不管返回条数)
IEnumerable<Indicador> indicadorList = IndicadorParser.ParseToList(dataFromApi);

// 场景2:确定接口仅返回1条数据,直接拿单个对象
Indicador? singleIndicador = IndicadorParser.ParseToSingle(dataFromApi);

原有方案失败原因

你之前尝试用Dictionary反序列化失败是因为C#大小写敏感,你写的List<indicador>类名首字母小写,和你定义的Indicador类名不匹配,修正后也可以正常工作:

// 修正后的Dictionary方案也可实现需求
var dict = JsonSerializer.Deserialize<Dictionary<string, List<Indicador>>>(dataFromApi, _defaultOptions);
var indicadorList = dict?.First().Value ?? new List<Indicador>();

相比Dictionary方案,JsonDocument的实现内存开销更低,性能更好。

内容的提问来源于stack exchange,提问作者AcidRod75

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:15:04