如何解决JsonSerializationException?API反序列化类型不匹配报错求助
问题分析与解决方案
错误核心原因
你遇到的反序列化错误本质是类型不匹配:
无法将当前JSON对象(如{"name":"value"})反序列化为类型'System.Collections.Generic.List`1[System.Diagnostics.Activity]',因为该类型需要JSON数组(如[1,2,3])才能正确反序列化。错误路径:'activity',第1行,第12位。
直白来说:你的代码里把activity字段定义成了集合类型(Listactivity对应的是单个JSON对象(用{}包裹),而非JSON数组(用[]包裹),导致反序列化器无法匹配类型。
具体解决方法
1. 修改实体类字段类型(最直接推荐)
如果API接口确实只返回单个Activity对象,直接修改实体类中对应字段的类型:
// 修改前 public List<Activity> activity { get; set; } // 修改后 public Activity activity { get; set; }
修改后重新执行反序列化,类型匹配就能正常解析数据。
2. 兼容单个对象/数组场景(API返回不稳定时用)
如果API有时返回单个对象、有时返回数组,可以通过自定义JSON转换器兼容。以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); return token.Type == JTokenType.Array ? token.ToObject<List<T>>() : new List<T> { token.ToObject<T>() }; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } }
- 给实体类的
activity字段添加转换器属性:
[JsonConverter(typeof(SingleOrArrayConverter<Activity>))] public List<Activity> activity { get; set; }
这样不管API返回单个对象还是数组,都能正确反序列化为List<Activity>。
3. 临时手动调整JSON(仅应急用)
如果暂时没法修改代码,可以先把API返回的JSON字符串中"activity": {...}替换为"activity": [{...}],将单个对象包裹成数组后再反序列化。但这种硬编码方式容易因API结构变化失效,不推荐长期使用。
内容的提问来源于stack exchange,提问作者User4567
相关产品推荐
相关产品推荐

