C#中如何从JsonPatchDocument对象提取操作携带的实际值
问题原因
你无法获取Id、name值的核心原因有两点:
- 遍历筛选得到的
Operation结果时,你直接在Operation对象上查找Id、name属性,但这两个字段并不属于Operation类本身,而是嵌套在Operation的value属性存储的数组内 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
相关产品推荐
相关产品推荐

