1. 程式人生 > 實用技巧 >ASP.NET Core JSON Patch使用簡述

ASP.NET Core JSON Patch使用簡述

簡述

JSON Patch 是一種格式,用於指定要應用於資源的更新。 JSON Patch文件有一個** 運算元組。 每個操作標識一種特定型別的更改。 此類更改的示例包括新增陣列元素或替換屬性值。

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();
}

官方文件地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-api/advanced/formatting?view=aspnetcore-3.1#add-newtonsoftjson-based-json-format-support