کتابخانه Json Serializer داخلی دات نت تحت عنوان System.Text.Json در NET Core 3.0 معرفی شد و به منظور پرفرمنس و یکپارچگی بیشتر، به عنوان سریالایزر پیشفرض ASP.NET Core 3.0 قرار گرفت و نیز برای استفاده از Json.NET که تا قبل از اون، سریالایزر پیشفرض ASP.NET Core بود، یک پکیج جداگانه اضافه شد تا بشه اون رو توی ASP.NET Core تنظیمش کرد.
🔸کتابخونه System.Text.Json اما، یک سری نواقص و مشکلات اساسی داشت که باعث میشد خیلی برای استفاده در محیط Production مناسب نباشه مثلا:
1️⃣ اگه 2تا شی داشته باشین که به هم دیگه دارن رفرنس میدن، موقع سریالایز با خطا مواجه میشدین (که اصطلاحا بهش Reference Loop یا Circular References میگن)
این یک امکان مهم و اساسی لازم برای سریالایز ها هست و متاسفانه نه تنها پشتیبانی نمیکرد بلکه راه حل workaround ایی هم نداشت!
2️⃣ مشکل بعدی اینکه مثلا اگه شما یه پروپرتی عددی به نام Age داشته باشین و سمت کلاینت مقدار json اش رو به صورت رشته ای (string) ارسال کنین به سرور (دقت کنید مقدار عددی داخل "" (Quote) محصور شده.)
{
Age: "27"
}
تا قبل از این با Exception مواجه میشدین چرا که به صورت پیشفرض مقادیر عددی رو فقط میتونست به صورت عددی Serialize و Deserialize کنه. یعنی به این صورت{
Age: 27
}
البته این مشکل، راه حل workaround داشت که اینجا میتونین ببینین ولی به صورت پیشفرض این امکان رو نداشت3️⃣ مشکل بعدی اینکه اگه کلاس شما سازنده پیشفرض یا بدون پارامتر نداشت موقع Deserialize به خطا میخوردین؛ همچنین از Field ها و non-public Property ها هم پشتیبانی نمیکرد.
🔸خوشبختانه اما، در دات نت 5.0 تمامی این مشکل ها برطرف شده و به سطحی از پختگی و بلوغ رسیده که بشه بدون نگرانی ازش استفاده کرد. همچنین کلی بهبود پرفرمنسی و تعدادی فیچر جدید هم اضافه کرده از جمله:
✅ لیست بهبود ها و فیچر های جدید
✔️ بهبود پرفرمنسی 2.4 برابری در Serialize و 1.5 برابری در Deserialize (بنچمارک ها اینجا و اینجا)
✔️ برطرف شدن مشکل ReferenceLoopHandling (یا همون Circular References) به واسطه اضافه شدن تنظیم جدید
ReferenceHandler.Preserve (مشابه PreserveReferencesHandling.Ignore در Json.Net) (نمونه مثال)✔️ اضافه شدن پشتیبانی از Serialize و Deserialize مقادیر عددی به صورت string ایی توسط تنظیم جدید
NumberHandling ✔️ پشتیبانی از Serialize و Desersialize مقادیر Field ها و non-public Properties توسط تنظیم جدید
IncludeFields (نمونه مثال)✔️ پشتیبانی از Serialize و Desersialize نوع record معرفی شده در سی شارپ 9.0 (نمونه مثال)
✔️ پشتیبانی از immutable struct و اضافه شدن اتریبیوت [JsonConstructor] برای مشخص کردن سازنده پیشفرض جهت نمونه سازی به هنگام Deserializing (نمونه مثال)
✔️ بهبود پشتیبانی از نوع Dictionary<K,V> l برای کلید های غیر string ایی (نمونه مثال)
🔰اطلاعات بیشتر
▪️اگر دنبال مقاله فارسی هستین برای System.Text.Json که اکثر موارد مهم رو پوشش داده باشه، این مقاله رو پیشنهاد میکنم
▪️اینجا هم میتونین لیست Breake-Change های سریالایزر در دات نت 5.0 رو مطالعه کنین
و نهایتا اگه میخواین به زیر و بم System.Text.Json مسلط بشین بدون شک این 2تا لینک بهترین هستند
▪️داکیومنت مهاجرت از Newtonsoft.Json به System.Text.Json
▪️داکیومنت کامل استفاده از System.Text.Json
_______________