JSON Patch使用
介绍:
JSON Patch是一种描述JSON文档更改的格式。当只更改了一部分时,可用于避免发送整个文档。当与HTTP PATCH方法结合使用时,它允许以符合标准的方式对HTTP API进行部分更新。
JSON Patch本身就是JSON文档。
为什么使用JsonPatch:
JSON Patch的一大优势在于它的请求操作体很小,只发送对象的更改内容。相对要谨慎一点,只更新请求的内容。
比较常见有四大操作:
Add 向 JSON 对象中添加一对 key - value,或者向 Json Array 中加个元素。
Move 把某个节点从一个地方移到另一个地方。
Replace 替换,比如把 city 的值从“广州”改为“珠海”。
Remove 删除 JSON 对象中的某对 key - value,或者从 Json Array 中删除一个元素。
copy 复制,将值从JSON文档中的一个位置复制到另一个位置。这两个from和path是JSON指针。操作:{ "op": "copy", "from": "/biscuits/0", "path": "/best_biscuit" }
test 测试是否在文档中设置了指定的值。如果测试失败,则整个补丁都不适用。{ "op": "test", "path": "/best_biscuit/name", "value": "Choco Leibniz" }
简单的例子
原始文件
{
"baz": "qux",
"foo": "bar"
}
补丁
[
{ "op": "replace", "path": "/baz", "value": "boo" },
{ "op": "add", "path": "/hello", "value": ["world"] },
{ "op": "remove", "path": "/foo" }
]
结果
{
"baz": "boo",
"hello": ["world"]
}
ASP.NET Core案例
添加nuGet包:Microsoft.AspNetCore.JsonPatch
服务器端:
[HttpPost("/Orders/PostTest")]
public Dictionary<string, string> PostTest(
[FromBody]JsonPatchDocument<IDictionary<string, string>> body
)
{
Dictionary<string, string> dict = new Dictionary<string, string> { { "name", "fan" }, { "age", "18" } };
body.ApplyTo(dict);
return dict;
}
public string GetTest(
[FromBody]JsonPatchDocument<User> body
)
{
User u = new User();
body.ApplyTo(u);
return "true";
}
客户端:
HttpClient client = new HttpClient();
string responseText = client.PostAsync("http://localhost:7777/webapi/a1/orders/posttest", "[{\"op\" : \"replace\",\"path\" : \"/name\",\"value\" : \"fanfan\"},{\"op\" : \"add\",\"path\" : \"/class\",\"value\" : \"333\"}]", null,Encoding.UTF8).Result;
//
返回结果:
{
"name": "fanfan",
"age": "18",
"class": "333"
}
就是如果你的 JSON Patch 文档的 TModel 是一个类,由于 .NET 是面向对象的,你不能随便向一个类添加属性,因此,add 操作对于类是不可行的,但你可以进行 replace 操作
参考:
https://www.cnblogs.com/tcjiaan/p/9034869.html
http://jsonpatch.com/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构