JSON Patch 是啥玩意兒?不知道,直接翻譯吧,就叫它「Json 補丁」吧。幹嘛用的呢?固然是用來修改 JSON 文檔的了。那咋修改呢?比較常見有四大操做:AMRR。json
咋解釋呢?api
A—— Add;數組
M—— Move;服務器
R—— Replace;網絡
R—— Remove。app
Add 就是向 JSON 對象中添加一對 key - value,或者向 Json Array 中加個元素。測試
Move 就是把某個節點從一個地方移到另外一個地方。jsonp
Replace 就是替換,好比把 city 的值從「廣州」改成「珠海」。ui
Remove 就是刪除 JSON 對象中的某對 key - value,或者從 Json Array 中刪除一個元素。spa
除了上述四大美女外,還有 copy,就是把某個節點複製到另外一個地方;test 這個嘛,在修改 JSON 文檔以前驗證某個值,若是值正確了就進行更新,若是值不對就「呵呵「,好比,能夠 test 一下 age 屬性是否爲 25,若是是就更新 SON 文檔,若是不是就算了吧。
這個 JSON Patch 也不是很複雜,你能夠參考主頁上的說明,主頁地址:http://jsonpatch.com/
這個 JSON Patch 有什麼用呢?有用得很!尤爲是如今不少數據都是經過網絡來傳輸的,並且許多數據也喜歡用 JSON 格式(貌似是比 XML 簡單一些)。若是 JSON 文檔比較長,客戶端獲取了數據後,而後可能會對數據進行更新,而後更新時又把整個 JSON 文檔提交回服務器。雖然這一來一回,所產生的流量遠不如你打《王者農藥》所產生的流量,可是,若是傳輸頻繁,這個流量消耗也是不小的,畢竟各大運營商是增不降費的。按照如今各類破 App 內含數不勝數的虛假廣告和一些無用的圖片信息,刷幾條微博就刷掉 5-6 M 的流量了。
因此說,儘可能減小傳輸量是頗有必要的。JSON Patch 沒必要把整個 JSON 文檔都提交回服務器,而僅告訴服務器你要更新哪一個地方就行了。好比
[ { "op" : "add", "path" : "/age", "value" : "150" }, { "op" : "replace", "path" : "/name", "value" : "老鬼" } ]
注意,JSON Patch 本質上也是一個 JSON 文檔。在寫的時候,要記得最外面有一層中括號,爲啥?你都看到了,是個數組。由於你能夠同時把多個操做組合在一塊兒提交。就像上面的,add 和 replace 操做就一塊兒提交了。
固然了,老周本文重點是介紹如何在 ASP.NET Core 中使用 JSON Patch 的,因此,下面我們切入正題,不說 F 話了。
ASP.NET Core 的 API 自身也有與 JSON Patch 相關的實現,因此,用起來仍是挺省心的。這些 API 都分佈在 Microsoft.AspNetCore.JsonPatch.* 命名空間中。
至關核心的一個類就是 JsonPatchDocument<TModel>,TModel 是指你要用來生成 JSON 文檔的模型類。當客戶端提交 JSON Patch 上來後,會自動包含在該對象上,而後你只要調用一下 AppliyTo 方法就能夠對模型對象進行更新了。
很是簡單的,下面老周就給你演示一下。這裏我用的 Web API ,由於這一情形是最爲經常使用的。模型對象是一個字典實例—— IDictionary<string, object>,之因此用字典,是由於字典比較好添加屬性。
添加一個 API 控制器類,而後初始化一個字典實例。
[Route("api/[controller]")] public class DemoController : Controller { IDictionary<string, object> dic = new Dictionary<string, object> { ["name"] = "非洲黑鹿", ["age"] = 35, ["phone"] = "19929939900" }; }
爲了能夠獲取數據,能夠定義一個 HTTP-GET 方法訪問的方法,並將字典以 JSON 文檔返回。
[HttpGet("pick")] public IActionResult PickData() { return Json(dic); }
下面來重點了,爲了可以使用 JSON Patch 來更新字典對象,還要弄一個以 HTTP-POST 方法提交的方法。
[HttpPost("set")] public IActionResult SetData([FromBody]JsonPatchDocument<IDictionary<string,object>> body) { body.ApplyTo(dic); return Json(dic); }
請嚴重注意:
一、方法參數的類型是 JsonPatchDocument<TModel>,這樣服務器收到客戶端提交的 JSON Patch 文檔後會自動建立 JsonPatchDocument 實例並傳遞給 body 參數。
二、在參數上要應用 FromBodyAttribute (特性),由於你得告訴運行時,客戶端 POST 上來的整個數據正文將用於生成 JSON Patch 文檔。
三、更新字典實例很簡單,直接調用 JSON Patch 文檔的 ApplyTo 方法就完事了。
好了,就是這麼簡單,這個演示的例子就完工了。不過得打開 Program.cs 文件,配置一下 Host。
public static void Main(string[] args) { WebHostBuilder bd = new WebHostBuilder(); bd.UseContentRoot(Directory.GetCurrentDirectory()) .UseStartup<Startup>() .UseUrls("http://*:6000") .UseKestrel(); var host = bd.Build(); host.Run(); }
http://*:6000 表示應用程序的 URL 在 6000 端口上偵聽鏈接,* 表示綁定給本機的任意主機名。好比 localhost。
在 Startup 類中,還要配置 MVC 的內容,Web API 其實也是 MVC 的一種,只是它不返回 HTML 。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app) { app.UseMvc(); }
因爲剛纔在 DemoController 控制器中已經用了路由特性指定了路由規則,那麼這裏就不用再配置全局路由規則了。
[Route("api/[controller]")]
好,如今咱們來測試一下。測試 API 能夠用 Postman 大叔,由於它比較牛。
首先,輸入 URL http://localhost:6000/api/demo/pick,方式爲 GET。
而後返回如下數據。
如今,咱們把裏面的 name 屬性改成「巴西龜」。輸入 URL http://localhost:6000/api/demo/set,提交方式爲 POST。
選擇 「body」 ,格式選 raw,Content Type 選 JSON ( application / json )。
而後輸入如下 JSON 。
[ { "op" : "replace", "path" : "/name", "value" : "巴西龜" } ]
提交以後,獲得更新後的字典數據。
咱們還能夠進行多個操做,除了修改 name 的值,還能夠考慮添加一個項。
[ { "op" : "replace", "path" : "/name", "value" : "巴西龜" }, { "op" : "add", "path" : "/email", "value" : "small-pig@163.com" } ]
向字典添加一個 email 字段。
發送請求後,返回字典數據的最新內容。
好了,簡單的演示就結束了。
最後,老周還要強調一點,就是若是你的 JSON Patch 文檔的 TModel 是一個類,因爲 .NET 是面向對象的,你不能隨便向一個類添加屬性,所以,add 操做對於類是不可行的,但你能夠進行 replace 操做。
=============================
前兩天,也就是上個星期六,因爲張老鬼找老周有點事情研究,因此【閒聊 ASP.NET Core】的直播暫停一次。這個星期能夠補上,週六週日都行,到時候老週會在微博上發一下時間,由於這個週末,女友所在的公司組織全體員工去長途旅遊,因此這個週末老周就能夠自由了,愛幹嘛就幹嘛。
咱們倆都是窮人家的孩子,雙方都沒有車,距離又有點遠,每次見面都要滴滴打車,因此一個月也只能見兩三次面。這個五月她那邊比較忙,只見了一次面。沒辦法,想每天去浪是不可能的了。這就是我們平頭百姓的生活。