介紹:
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/