.NET 6使用JsonPatchDocument向JSON数组添加元素抛出异常问题
问题根因
异常和结果不符合预期由两个核心问题导致:
- 基础用法疏漏:
JsonPatchDocument实例调用Add等方法仅用于定义补丁操作规则,必须显式调用ApplyTo()方法将补丁作用到目标对象上,否则修改永远不会生效,你当前代码直接序列化原始对象,本身逻辑就不完整。 - 类型适配缺失:
Microsoft.AspNetCore.JsonPatch的默认实现是基于Newtonsoft.Json类型体系开发的,内置操作适配器仅对JObject、JArray等Newtonsoft.Json类型完整支持JSON Patch规范中-代表数组末尾的特殊语法。你使用System.Text.Json反序列化得到的ExpandoObject、JsonNode类型,会被默认适配器将路径中的-识别为普通属性名查找,找不到对应成员自然抛出指定位置不存在的异常。Replace操作能正常运行,是因为它仅需要定位已存在的属性/索引,不需要解析数组追加的特殊路径标记。
解决方案
如果没有强制要求必须使用System.Text.Json做序列化,直接采用官方默认适配的Newtonsoft.Json即可实现需求,步骤如下:
- 安装所需NuGet包:
Microsoft.AspNetCore.JsonPatch、Newtonsoft.Json - 运行代码:
using Microsoft.AspNetCore.JsonPatch; using Newtonsoft.Json; using Newtonsoft.Json.Linq; string input = @"{ ""foo"": [ 1 ] }"; var obj = JsonConvert.DeserializeObject<JObject>(input); var patch = new JsonPatchDocument(); patch.Add("/foo/-", 2); patch.ApplyTo(obj); // 执行补丁应用 string output = JsonConvert.SerializeObject(obj); Console.WriteLine(output); // 输出 {"foo":[1,2]},完全符合预期
如果你必须在.NET 6环境下配合System.Text.Json的ExpandoObject/JsonNode类型使用JsonPatch,需要自行实现对应类型的IObjectAdapter,补充-路径的数组追加逻辑,替换默认适配器后才能正常运行,实现成本远高于直接使用官方适配的Newtonsoft.Json方案。
内容的提问来源于stack exchange,提问作者Maxime Rossini
相关产品推荐
相关产品推荐

