如何为JsonPatchDocument传递自定义JsonSerializerSettings而非全局设置?
解决JsonPatchDocument.ApplyTo使用自定义JsonSerializerSettings的方法
默认情况下JsonPatchDocument.ApplyTo会依赖JsonConvert.DefaultSettings的全局配置,要在不修改全局设置的前提下使用自定义配置,有以下两种可行方案:
方案一:编写扩展方法封装自定义配置逻辑
通过自定义扩展方法,手动创建使用指定JsonSerializerSettings的序列化器,再构建对应的ObjectAdapter来执行补丁操作:
using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Microsoft.AspNetCore.JsonPatch.Adapters; public static class JsonPatchExtensions { public static void ApplyToWithCustomSettings(this JsonPatchDocument patchDoc, object targetObject, JsonSerializerSettings customSettings) { var serializer = JsonSerializer.Create(customSettings); var objectAdapter = new ObjectAdapter(serializer.ContractResolver, new DefaultNamingStrategy()); patchDoc.ApplyTo(targetObject, objectAdapter); } }
调用时直接传入你的自定义配置即可:
var customSettings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new YourCustomJsonConverter() }, // 其他自定义配置项 }; patchDocument.ApplyToWithCustomSettings(yourTargetObject, customSettings);
方案二:直接调用带IObjectAdapter参数的ApplyTo重载
如果不想编写扩展方法,也可以在调用时手动构建ObjectAdapter,将自定义配置中的ContractResolver传入,直接调用重载版本的ApplyTo:
var customSettings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new YourCustomJsonConverter() } }; var serializer = JsonSerializer.Create(customSettings); var adapter = new ObjectAdapter(serializer.ContractResolver, new DefaultNamingStrategy()); patchDocument.ApplyTo(yourTargetObject, adapter);
原理说明
JsonPatchDocument.ApplyTo的默认实现内部会使用基于全局配置的ObjectAdapter,上述两种方案都是通过手动构建使用自定义序列化配置的ObjectAdapter,绕过全局默认设置,从而让补丁操作使用你指定的序列化规则。
内容的提问来源于stack exchange,提问作者HoBa
相关产品推荐
相关产品推荐

