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

Newtonsoft.Json反序列化异常:如何正确定义嵌套列表?

解决JSON反序列化时的类型不匹配问题

这个问题其实很典型——咱们直接看错误信息就能定位根源:你的JSON数据里,geolocation字段是单个JSON对象(比如{"longitude":"123", "latitude":"456"}),但你在C#的hotels类里把它定义成了List<geolocation>,而列表类型要求对应的JSON必须是数组格式(比如[{"longitude":"123"}, {"longitude":"456"}]),类型不匹配自然就抛出了反序列化异常。

最直接的解决方案(当JSON里geolocation确实是单个对象时)

修改hotels类的定义,把List<geolocation>改成单个geolocation对象即可:

public class hotels { 
    public string hotel_code { get; set; } 
    public geolocation geolocation { get; set; } // 移除List<>包装
}

修改后再执行你的反序列化代码:

HotelResponse myDetails = JsonConvert.DeserializeObject<HotelResponse>(final);

就能正常解析了。

特殊情况:JSON里geolocation可能是单个对象或数组

如果后端返回的JSON中,geolocation字段有时候是单个对象,有时候是数组,你可以使用Newtonsoft.Json的自定义转换器来兼容两种情况。首先定义一个通用转换器:

public class SingleOrArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<T>);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        {
            return token.ToObject<List<T>>();
        }
        return new List<T> { token.ToObject<T>() };
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

然后在hotels类的geolocation字段上添加特性:

public class hotels { 
    public string hotel_code { get; set; } 
    [JsonConverter(typeof(SingleOrArrayConverter<geolocation>))]
    public List<geolocation> geolocation { get; set; } 
}

这样无论JSON里是单个对象还是数组,都能正确反序列化为列表。

额外提醒

如果你的业务逻辑确实需要geolocation是列表,那要先确认后端返回的JSON是否符合预期——是不是后端本该返回数组却错误返回了单个对象?这种情况下也需要和后端沟通修正数据格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:40:42