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

ASP.NET Core中配置Newtonsoft.Json仅对对象启用TypeNameHandling.Auto排除数组

解决方案

你可以通过自定义DefaultContractResolver全局重写集合类型的序列化规则,无需修改任何已有类的特性,完全适配第三方库无法修改的场景:

第一步:实现自定义契约解析器

using System.Collections;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

public class IgnoreEnumerableTypeNameContractResolver : DefaultContractResolver
{
    protected override JsonContract CreateContract(Type objectType)
    {
        var contract = base.CreateContract(objectType);
        
        // 排除字符串类型(字符串实现了IEnumerable<char>但不属于需要处理的集合)
        if (objectType != typeof(string) && typeof(IEnumerable).IsAssignableFrom(objectType))
        {
            // 所有集合、数组类型单独关闭TypeNameHandling,优先级高于全局配置
            contract.TypeNameHandling = TypeNameHandling.None;
        }

        return contract;
    }
}

第二步:替换原有配置中的契约解析器

修改你的MvcJsonOptionsSetup类中的Configure方法,将原来的DefaultContractResolver替换为上面实现的自定义解析器:

public override void Configure(MvcNewtonsoftJsonOptions options)
{
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    // 替换为自定义的契约解析器
    options.SerializerSettings.ContractResolver = new IgnoreEnumerableTypeNameContractResolver();
    options.SerializerSettings.ConfigureRepositoryForJson<EntidadeBase>(GetProvider());
    options.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto;
}

生效说明

  • 所有数组、集合类型序列化时会直接输出数组结构,不会出现$type和$values包装字段
  • 非集合的子类对象仍然会保留$type字段,不影响原有反序列化逻辑
  • 无需对任何已有类添加特性,第三方库类也会自动适配规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:57:02