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

C#中如何从JsonPatchDocument对象提取操作携带的实际值

问题原因

你无法获取Id、name值的核心原因有两点:

  1. 遍历筛选得到的Operation结果时,你直接在Operation对象上查找Id、name属性,但这两个字段并不属于Operation类本身,而是嵌套在Operation的value属性存储的数组内
  2. value属性是弱类型动态对象,没有做反序列化处理的情况下,无法直接访问内部的字段值
正确实现代码
// 引入对应序列化命名空间,微软官方JsonPatch默认依赖Newtonsoft.Json
using Newtonsoft.Json;
using Microsoft.AspNetCore.JsonPatch.Operations;

public async Task<IActionResult> UpdateData([FromBody] JsonPatchDocument<EmployeeDocument> patchDoc)
{
    // 匹配目标路径的操作项,增加大小写不敏感规则避免传参格式差异导致匹配失败
    var targetOperation = patchDoc.Operations
        .FirstOrDefault(o => o.path.Equals("/basepathofemployee", StringComparison.OrdinalIgnoreCase));
    
    if (targetOperation == null)
    {
        return BadRequest("未找到指定路径的员工更新操作");
    }

    // 将value属性反序列化为强类型员工集合
    var employeeList = JsonConvert.DeserializeObject<List<Employee>>(targetOperation.value.ToString());

    // 遍历集合即可拿到需要的值
    foreach (var emp in employeeList)
    {
        string currentId = emp.Id; // 依次拿到"12"、"89"
        string currentName = emp.name; // 依次拿到"ABC"、"XYZ"
        // 编写你的后续业务逻辑
    }

    // 其余业务处理
    return Ok();
}

// 定义和payload字段匹配的员工接收类
public class Employee
{
    public string Id { get; set; }
    public string name { get; set; }
}
注意事项
  • 如果你确定目标path只会对应一个操作,用FirstOrDefault比Where更高效,不需要返回IEnumerable集合
  • 如果你的项目使用System.Text.Json做序列化,把反序列化的代码替换为JsonSerializer.Deserialize<List<Employee>>(targetOperation.value)即可
  • 不要混用序列化库处理JsonPatch的内容,否则容易出现类型转换异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:45:58