انتقال Json با استفاده از Json.Net و JsonPath

سه شنبه 9 آبان 1396

در این مقاله قصد داریم در مورد json.net و عملکرد آن صحبت نماییم و بعد در موردapi ها صحبت کنیم و این دو را با هم مقایسه نماییم و عملکرد های آن ها را بررسی کنیم و مثال هایی از آن را ببینیم.

انتقال Json با استفاده از Json.Net  و JsonPath

امروزه api ها برای rest خیلی بهتر از چند سال پیش عمل می کند برای برآورده کردن بسیاری از سناریوها با استفاده از API ها بهترین اطلاعات به دست می آید.

حالا در زمینه ی api سوالی پیش می آید

اینکه چگونه یک client می تواند تنها حوزه هایی که نیاز به نمایش پاسخ دارد را فیلتر کند؟

برای این سوال جواب این است که:

امروزه از GraphQL استفاده می کنند این ایده به این صورت است که restapi را با کم ترین  تاثیر به سمت client افزایش می دهد.

ایده عمومی

Api ها یک حالت شناخته شده دارند که اینجا می خواهم در مورد حالت ایده آل صحبت کنیم که به ندرت تغییر می کند در زیر مثال آن وجود دارد:

{
    'FirstName': 'John', 
    'LastName': 'Smith',
    'Enabled': false,
    'Roles': [ 'User' ],
    'Results' : [ 1, 2, 3 ]
}

حال اگر ما درخواستی را در سرصفحه HTTP تعریف کنیم که یک نمایش جدید تعریف کند چه می‌شود ؟ و اگر بتوانیم از JSONPath استفاده کنیم چطور؟

{
    'FirstName': '',
    'Role' : '$.Roles[0]'
}

نتیجه ای که ما خواهیم گرفت:

{
    "FirstName": "John",
    "Role": "User"
}

استفاده از Json.net

Json.net به شما اجازه می دهد تا از jsonPath برای انتخاب توکن استفاده کنید اثبات سریع این است که یک الگو می گیرد و یک فیلد را انتخاب می کند.

using System;
using Newtonsoft.Json.Linq;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var original = JObject.Parse(@"{
               'FirstName': 'John', 
               'LastName': 'Smith',
               'Enabled': false,
               'Roles': [ 'User' ],
               'Results' : [ 1, 2, 3]
             }");
            var template = JObject.Parse(@"{
              'FirstName': '',
              'Role' : '$.Roles[0]'
            }");

            var result = Process(original, template);

            Console.WriteLine(result.ToString());
            /*
              {
                "FirstName": "John",
                "Role": "User"
              }
             */
        }

        private static JObject Process(JObject original, JObject template)
        {
            var result = new JObject();

            foreach (var property in template.Properties())
            {
                var value = property.Value?.ToString();

                var path = value?.StartsWith("$") == true
                    ? value
                    : property.Path;

                var selected = original.SelectToken(path);
                result.Add(property.Name, selected);
            }

            return result;
        }
    }
}

چطور حالا از آن استفاده کنیم:

داشتم به نوشتن قطعه‌ای از OWIN یا Middleware اصلی ASP.NET فکر می‌کردم

که اگر سرفصل X - TEMPLATE در درخواست وجود داشته باشد، می‌تواند هر گونه پاسخ JSON  را رد کند

مزایای این رویکرد به صورت زیر است:

1-می‌تواند در بالای یک API REST موجود باشد

2-اجرا agnostic

3-کاهش بار شبکه

همچنین از عملکرد منفی ان عبارت است از:

1-backend باید کل پاسخ را ایجاد کند

2-تبدیلات مختلف به معنای پاسخ‌های متفاوت هستند که catch را پر میکند

3-تغییرات نادرست ممکن است نتایج نادرستی داشته باشند

4-محدودیت‌های اندازه ی هدرهای HTTP ۸ کیلوبایت - ۱۶ کیلوبایت

در آخر نتیجه گیری

graphQl با api شباهتی ممکن است داشته باشد اما از نظر عملکردی در بعضی از قسمت ها با هم مشابه هستند

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید