【ASP.NET Core】JSON Patch 使用簡述

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】的直播暫停一次。這個星期能夠補上,週六週日都行,到時候老週會在微博上發一下時間,由於這個週末,女友所在的公司組織全體員工去長途旅遊,因此這個週末老周就能夠自由了,愛幹嘛就幹嘛。

咱們倆都是窮人家的孩子,雙方都沒有車,距離又有點遠,每次見面都要滴滴打車,因此一個月也只能見兩三次面。這個五月她那邊比較忙,只見了一次面。沒辦法,想每天去浪是不可能的了。這就是我們平頭百姓的生活。

相關文章
相關標籤/搜索