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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:47:11