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
相关产品推荐
相关产品推荐

