C#接口类型JSON反序列化异常问题求助
解决Json反序列化接口类型报错的问题
这个问题我之前做WebAPI对接时也踩过坑!Json序列化器根本没法直接实例化接口或者抽象类,所以当它碰到List<IBar>这种类型时,完全不知道该创建哪个具体的实现类对象,自然就抛出你看到的JsonSerializationException了。下面给你几个实用的解决办法:
方案一:开启类型名称自动处理(适合用Newtonsoft.Json的场景)
如果你的项目用的是Newtonsoft.Json(MVC/WebAPI默认就是这个),可以通过开启TypeNameHandling让序列化后的Json带上具体类型信息,反序列化时就能自动识别要实例化的类了。
全局配置(WebAPI端)
在WebAPI的WebApiConfig.cs里添加配置:
public static void Register(HttpConfiguration config) { // 其他配置... config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; }
局部序列化(如果是手动序列化单个对象)
var jsonString = JsonConvert.SerializeObject(yourFooInstance, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
⚠️ 注意:开启这个功能要小心安全风险,避免反序列化来自不可信来源的恶意Json数据。
方案二:自定义Json转换器
如果不想全局修改序列化配置,或者需要更灵活的类型控制,可以写一个自定义的Json转换器,强制指定IBar的具体实现类。
假设你的IBar具体实现类是Bar,先写转换器:
public class BarConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(IBar); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 强制反序列化为Bar类 return serializer.Deserialize<Bar>(reader); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { serializer.Serialize(writer, value as Bar); } }
然后注册这个转换器:
- 全局注册:同样在
WebApiConfig.cs里添加
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new BarConverter());
- 局部标注:直接在IBar接口上加特性
[JsonConverter(typeof(BarConverter))] public interface IBar { // 接口成员 }
方案三:改用具体类(最简单直接的方案)
如果你的业务场景里IBar只有一个固定的实现类,而且不需要替换其他实现,那直接把模型里的List<IBar>改成List<Bar>就行,序列化器就能直接实例化具体类,完全不用额外配置。
修改后的Foo类:
public class Foo:IFoo { private List<Bar> _listTest=new List<Bar>(); public List<Bar> ListTest { get { return _listTest; } set { _listTest=value; } } }
内容的提问来源于stack exchange,提问作者coolblue2000
相关产品推荐
相关产品推荐

