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
相关产品推荐
相关产品推荐

