如何使用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
相关产品推荐
相关产品推荐

