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

使用JsonPatchDocument时能否将path属性重命名为fieldToChange?

实现方案

完全可以实现,无需替换原生JsonPatchDocument<T>对象,核心方案是通过自定义JSON反序列化转换器,将请求体中的fieldToChange字段映射到补丁操作的Path属性即可。

具体实现(以ASP.NET Core默认的System.Text.Json序列化器为例)

  1. 编写针对补丁操作类Operation<T>的自定义序列化转换器,完成字段映射逻辑:
using Microsoft.AspNetCore.JsonPatch.Operations;
using System.Text.Json;
using System.Text.Json.Serialization;

public class CustomPatchOperationConverter<T> : JsonConverter<Operation<T>> where T : class
{
    public override Operation<T> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        using var jsonDoc = JsonDocument.ParseValue(ref reader);
        var root = jsonDoc.RootElement;
        var operation = new Operation<T>();

        // 把自定义字段fieldToChange映射到原生Path属性
        if (root.TryGetProperty("fieldToChange", out var pathElement))
        {
            operation.path = pathElement.GetString();
        }
        // 其余补丁字段按原规则映射
        if (root.TryGetProperty("op", out var opElement))
        {
            operation.op = opElement.GetString();
        }
        if (root.TryGetProperty("value", out var valueElement))
        {
            operation.value = valueElement.Deserialize<object>(options);
        }
        if (root.TryGetProperty("from", out var fromElement))
        {
            operation.from = fromElement.GetString();
        }

        return operation;
    }

    public override void Write(Utf8JsonWriter writer, Operation<T> value, JsonSerializerOptions options)
    {
        // 若接口不需要返回补丁格式内容,该方法可直接抛出NotImplementedException
        writer.WriteStartObject();
        writer.WriteString("op", value.OperationType.ToString().ToLower());
        writer.WriteString("fieldToChange", value.path);
        if (value.value != null)
        {
            writer.WritePropertyName("value");
            JsonSerializer.Serialize(writer, value.value, options);
        }
        if (!string.IsNullOrWhiteSpace(value.from))
        {
            writer.WriteString("from", value.from);
        }
        writer.WriteEndObject();
    }
}
  1. 注册自定义转换器,在Program.cs中配置控制器的JSON选项即可全局生效:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 注册针对Product类型的补丁转换器,需要支持其他实体类型补充对应注册即可
        options.JsonSerializerOptions.Converters.Add(new CustomPatchOperationConverter<Product>());
    });

如果项目用的是Newtonsoft.Json作为序列化器,实现逻辑完全一致,只需编写继承自Newtonsoft.Json.JsonConverter的对应转换器,重写ReadJson方法完成字段映射即可。

注意事项

你贴出的请求体格式存在两处不符合JsonPatch规范的问题,调整后可用的请求示例如下:

  • JsonPatch请求体是操作数组格式,不是单个对象
  • 每个操作必须指定op字段标识操作类型(replace/add/remove/move/copy/test),原示例中value字段后缺少冒号属于笔误
[
  {
    "op": "replace",
    "fieldToChange": "/ProductName",
    "value": "测试商品名称"
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:36:18