JSON Convert سفارشی در دات نت (.NET)
تبدیل گر JSON چیست؟
یک تبدیل گر JSON کلاسی است که برای تسهیل تبدیل اشیاء یا مقادیر به فرمت JSON و بالعکس طراحی شده است.
در زمینه کار با APIها، سناریوهای مکرری وجود دارد که در آنها تبدیل مقادیر دریافت شده از سرویس گیرندگان HTTP به انواع داده ترجیحی ما ضروری می شود. در چنین شرایطی، مبدل ها می توانند نقش حیاتی ایفا کنند.
سناریوهای تبدیل JSON سفارشی
هیچ قانون سخت و عجیبی برای این موضوع وجود ندارد، اما در اینجا چند مورد وجود دارد که ساخت مبدل ها را مفید می دانم:
- مدیریت نوع شمارشی (Enum)
- فرمت بندی سفارشی تاریخ
- محلی سازی فرمت های تاریخ و عدد
نحوه ایجاد تبدیل گر JSON در دات نت (.NET)
من طرفدار کتابخانه System.Text.Json هستم، بنابراین نحوه ایجاد مبدل ها با استفاده از آن را نشان خواهم داد.
برای اینکه این موضوع قابل فهم تر باشد، بیایید یک سناریو ایجاد کنیم، فرض کنید یک پروپرتی در مدل پاسخ ما به نام "StatusCode" وجود دارد که از API که فراخوانی می کنیم برگردانده می شود.
مشکل این است که می تواند هم عدد صحیح (int) و هم رشته (string) باشد و ما مطمئن نیستیم که کدام یک برای این کلاس خواهد آمد. ممکن است کسی پیشنهاد کند که از نوع داده پویا (dynamic) استفاده کنیم !
اما من آن را دوست ندارم، من برای یک کار یک تبدیل گر JSON را مینویسم و نوع داده "StatusCode" را روی رشته تنظیم می کنم.
بنابراین کد من به این شکل خواهد بود:
اگر این مثال را دوست نداشتید اشکالی ندارد در اینجا فقط روی درک مفهوم تمرکز کنید!
حالا می توانیم این مبدل را به این شکل اعمال کنیم:
دقیقا چه اتفاقی در کد مبدل می افتد؟
متد خواندن (Read):
هنگامی که برنامه شما JSON را می خواند یا از حالت سریال خارج می کند، متد خواندن مسئول تبدیل داده های JSON به یک رشته است.
متد نوشتن (Write):
هنگامی که برنامه شما JSON را می نویسد یا سریال می کند، متد نوشتن مسئول تبدیل یک رشته به فرمت JSON مناسب است.
این مثال مبدل دیگری است که سریال سازی JSON پیش فرض در دات نت را برای یک نوع داده موجود نادیده می گیرد. این مبدل از قالب mm/dd/yyyy برای پروپرتی های DateTimeOffset استفاده می کند.
مبدلهایی که پارامتر میپذیرند + پترن Factory
گاهی اوقات نیاز داریم پارامترهایی را به مبدل خود ارسال کنیم، شاید فکر کنید چگونه می توانیم این کار را در مبدل ها انجام دهیم.
- برای هر سناریو مبدلهایی مانند کاری که در مرحله قبل انجام دادیم ایجاد کنید.
- اکنون یک کلاس دیگر به عنوان یک پترن Factory ایجاد کنید، این کلاس JsonConverterAttribute را پیاده سازی می کند.
از (reflection) در اینجا استفاده کنید، انواع داده را با typeOf بررسی کنید و مبدل های مورد نظر خود را فراخوانی کنید.
در برخی موارد، مبدل ها فقط با قرار دادن روی پروپرتی کار نمی کنند، ما باید آنها را به گزینه های سریال سازی اضافه کنیم. من بیشتر با Refit کار می کنم و نیازی به اضافه کردن چنین کلاسهایی نمیبینم اما اگر به دلایلی کار نکرد، می توانید آن را به این شکل اضافه کنید:
اکنون می توانید از این نمونه برای سریال سازی/خروج از حالت سریال استفاده کنید.