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

.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即可实现需求,步骤如下:

  1. 安装所需NuGet包:Microsoft.AspNetCore.JsonPatch、Newtonsoft.Json
  2. 运行代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:42:23