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

使用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 
});

必做验证

  1. 检查$type的正确性:JSON中的"Foo1, MyLibrary"必须和类的完整命名空间、程序集名称完全匹配。比如类在MyLibrary.Foo命名空间下,$type应该写成"MyLibrary.Foo.Foo1, MyLibrary"。
  2. 安全注意:使用TypeNameHandling时,若反序列化不可信JSON存在安全风险,建议搭配SerializationBinder限制允许的类型,防止恶意类型注入。

可选优化

如果不想全局修改序列化设置,也可以给Parent类的Foos属性单独配置:

public class Parent
{
    [JsonProperty(TypeNameHandling = TypeNameHandling.Objects)]
    public IFoo[] Foos { get; set; }
}

此时直接用默认反序列化方法即可,无需传JsonSerializerSettings。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:15:36