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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:31:01