使用Newtonsoft Json.NET反序列化接口数组时Foos属性为空的问题
问题解决:Json.NET反序列化接口数组返回null的原因及修复
核心问题
你用的TypeNameHandling.Auto模式,只有当目标类型是具体类,且JSON实际类型和目标类型不匹配时,才会读取$type标识。但你的数组元素类型是接口IFoo,Auto模式下Json.NET不会主动解析数组内的$type字段,导致无法正确创建Foo1/Foo2实例,最终Foos数组为null。
修复方法
将TypeNameHandling改为TypeNameHandling.Objects或TypeNameHandling.All,让Json.NET解析数组中每个对象的$type信息,从而正确实例化对应的实现类:
Parent parent = JsonConvert.DeserializeObject<Parent>(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects });
必做验证
- 检查$type的正确性:JSON中的
"Foo1, MyLibrary"必须和类的完整命名空间、程序集名称完全匹配。比如类在MyLibrary.Foo命名空间下,$type应该写成"MyLibrary.Foo.Foo1, MyLibrary"。 - 安全注意:使用
TypeNameHandling时,若反序列化不可信JSON存在安全风险,建议搭配SerializationBinder限制允许的类型,防止恶意类型注入。
可选优化
如果不想全局修改序列化设置,也可以给Parent类的Foos属性单独配置:
public class Parent { [JsonProperty(TypeNameHandling = TypeNameHandling.Objects)] public IFoo[] Foos { get; set; } }
此时直接用默认反序列化方法即可,无需传JsonSerializerSettings。
内容的提问来源于stack exchange,提问作者maxmoore14
相关产品推荐
相关产品推荐

