ASP.NET Core JSON Patch使用簡述
阿新 • • 發佈:2020-09-14
簡述
JSON Patch 是一種格式,用於指定要應用於資源的更新。 JSON Patch文件有一個** 運算元組。 每個操作標識一種特定型別的更改。 此類更改的示例包括新增陣列元素或替換屬性值。
-
PUT 和 PATCH 方法用於更新現有資源。 它們之間的區別是,PUT 會替換整個資源,而PATCH 僅指定更改。
-
參看地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-api/jsonpatch?view=aspnetcore-3.1
JSON 資料示例
{
"baz": "qux",
"foo": "bar"
}
JSON Patch 資料示例
[ { "op": "replace", "path": "/baz", "value": "boo" }, { "op": "add", "path": "/hello", "value": ["world"] }, { "op": "remove", "path": "/foo" } ]
在上述 JSON 中:
- op 屬性指示操作的型別。
- path 屬性指示要更新的元素。
- value 屬性提供新值。
使用JSON Patch 之後的資源結果
{
"baz": "boo",
"hello": ["world"]
}
下表顯示了 JSON 修補程式規範中定義的支援操作:
Operation | 說明 |
---|---|
add | 新增屬性或陣列元素。 對於現有屬性:設定值。 |
remove | 刪除屬性或陣列元素。 |
replace | 與在相同位置後跟 add 的 remove 相同。 |
move | 與從後跟 add 的源到使用源中的值的目標的 remove 相同。 |
copy | 與到使用源中的值的目標的 add 相同。 |
test | 如果 path 處的值 = 提供的 value,則返回成功狀態程式碼。 |
在Asp.net Core 中使用 JSON Patch
引用包
Microsoft.AspNetCore.JsonPatch
使用方式
在API 控制器中,JSON Patch操作方法:
- 在方法中使用
HttpPatch
特性標籤 - 接受
JsonPatchDocument<T>
,通常帶有[FromBody]
- 呼叫
ApplyTo()
方法應用更改
API 控制器程式碼如下:
[Route("")]
[HttpPatch]
public async Task<IActionResult> Patch([FromBody]JsonPatchDocument<AppUser> jsonPatch)
{
if (jsonPatch != null)
{
var user = await _userContext.Users.FirstOrDefaultAsync(s => s.Id == UserIdentity.UserId);
jsonPatch.ApplyTo(user);
_userContext.SaveChanges();
return Json(user);
}
else
{
return BadRequest(ModelState);
}
}
PostMan 請求示例
- 請求方式為:
PATCH
Content-Type
:application/json
[
{
"op":"replace",
"path":"/Company",
"value":"上海無敵土豆科技有限公司"
},
{
"op":"replace",
"path":"/Title",
"value":"小土豆"
}
]
陣列處理方式
[
{
"op":"replace",
"path":"/Properies",
"value":
[
{
"Key":"fin_stage",
"Value":"A+輪",
"Text":"A+輪"
},
{
"Key":"fin_stage",
"Value":"C輪",
"Text":"C輪"
}
]
}
]
可能會遇到下面的錯誤
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|fcde218-4047aa49553937bd.",
"errors": {
"$": [
"The JSON value could not be converted to Microsoft.AspNetCore.JsonPatch.JsonPatchDocument`1[User.API.Entity.Models.AppUser]. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
]
}
}
遇到上述錯誤的原因為程式無法正常解析該json,因為沒有找到NewtonsoftJson
包的依賴;關於微軟為何要移除該包的依賴,主要是為了提升執行效率;System.Text.Json
作為微軟內建json處理,效率更高更快,但是目前大部分主流的包還是使用的NewtonsoftJson開發
官方文件描述如下:
ASP.NET Core 3.0 之前的版本中,預設設定使用通過 Newtonsoft.Json
包實現的 JSON 格式化程式。 在 ASP.NET Core 3.0 或更高版本中,預設 JSON 格式化程式基於 System.Text.Json。
Newtonsoft.Json
通過安裝 Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet 包並在中進行配置,可獲得對基於的格式化程式和功能的支援 Startup.ConfigureServices
。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddNewtonsoftJson();
}