ASP.NET中JSON反序列化为Dictionary<string,List<CabinClass>>失败求助
问题排查与修复方案
第一个问题:模型映射逻辑错误
你当前的CabinRestrictions类标注位置完全错了:[JsonPropertyName("cabin_restrictions")]不该加在类上,而且这个类设计得冗余。正确逻辑是:GetAirFlightLookUpRoot里应该直接有一个对应JSON中cabin_restrictions字段的属性,类型要能处理API说明的对象/数组双结构,不需要套一层多余的CabinRestrictions类。
第二个问题:未处理双结构字段
API明确cabin_restrictions可能是对象或数组,默认的JsonSerializer无法自动识别这种可变结构,必须自定义JSON转换器来处理。
具体修复步骤
1. 重构模型结构
删掉冗余的CabinRestrictions类,直接在GetAirFlightLookUpRoot中定义目标字段,同时给CabinClass的属性加上精准的字段映射(避免类名与属性名冲突):
public class GetAirFlightLookUpRoot { // 保留你原有的其他字段 [JsonPropertyName("cabin_restrictions")] [JsonConverter(typeof(CabinRestrictionsConverter))] // 绑定自定义转换器 public Dictionary<string, List<CabinClass>> CabinRestrictions { get; set; } } public class CabinClass { [JsonPropertyName("bookingClass")] public string BookingClass { get; set; } [JsonPropertyName("cabinClass")] public string CabinType { get; set; } // 避免和类名重名导致混淆 [JsonPropertyName("marketingAirline")] public string MarketingAirline { get; set; } [JsonPropertyName("summaryText")] public string SummaryText { get; set; } [JsonPropertyName("completeText")] public List<string> CompleteText { get; set; } [JsonPropertyName("detailsText")] public List<string> DetailsText { get; set; } [JsonPropertyName("upsellAvailabilityNotice")] public string UpsellNotice { get; set; } [JsonPropertyName("altUpsellNotice")] public string AltUpsellNotice { get; set; } }
2. 实现自定义转换器处理双结构
创建转换器来识别数组或对象类型,分别做对应处理:
public class CabinRestrictionsConverter : JsonConverter<Dictionary<string, List<CabinClass>>> { public override Dictionary<string, List<CabinClass>> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var result = new Dictionary<string, List<CabinClass>>(); if (reader.TokenType == JsonTokenType.StartArray) { // 若API返回数组,可根据业务需求调整逻辑,示例为跳过数组元素返回空字典 while (reader.Read() && reader.TokenType != JsonTokenType.EndArray) { // 可根据实际场景修改处理逻辑 } return result; } if (reader.TokenType == JsonTokenType.StartObject) { // 正常反序列化为字典,对应API示例的嵌套对象结构 return JsonSerializer.Deserialize<Dictionary<string, List<CabinClass>>>(ref reader, options); } throw new JsonException("cabin_restrictions字段格式不符合预期"); } public override void Write(Utf8JsonWriter writer, Dictionary<string, List<CabinClass>> value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, options); } }
3. 检查序列化配置
确保你的_options开启了大小写不敏感匹配(如果JSON字段和模型属性名大小写不一致):
var _options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, // 保留你原有的其他配置 };
额外验证点
- 先打印API返回的原始JSON字符串,逐一对比字段名与模型中
JsonPropertyName的映射是否完全一致,注意下划线、大小写等细节。 - 确认JSON中
cabin_restrictions的对象结构:键是否为字符串类型的航空公司编码,值是否为符合CabinClass结构的数组。
内容的提问来源于stack exchange,提问作者dasha
相关产品推荐
相关产品推荐

