ASP.NET Core 3x دیگر به صورت پیشفرض به همراه Json.NET ارائه نمیشود
در برنامههای ASP.NET Core 3x، وابستگی ثالث Json.NET حذف شدهاست و از این پس هر نوع خروجی JSON آن، مانند بازگشت مقادیر مختلف از اکشن متدهای کنترلرها، به صورت خودکار در پشت صحنه از امکانات ارائه شدهی در System.Text.Json استفاده میکند و دیگر Json.NET، کتابخانهی پیشفرض کار با JSON آن نیست. بنابراین برای کار با آن نیاز به تنظیم خاصی نیست. همینقدر که یک پروژهی جدید ASP.NET Core 3x را ایجاد کنید، یعنی در حال استفادهی از System.Text.Json هستید.
روش بازگشت به Json.NET در ASP.NET Core 3x
اگر به هر دلیلی هنوز نیاز به استفادهی از کتابخانهی Json.NET را دارید، آداپتور ویژهی آن نیز تدارک دیده شدهاست. برای اینکار:
الف) ابتدا باید بستهی نیوگت Microsoft.AspNetCore.Mvc.NewtonsoftJson را نصب کنید.
ب) سپس در کلاس Startup، باید این کتابخانه را به صورت یک سرویس جدید، با فراخوانی متد AddNewtonsoftJson، معرفی کرد:
public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddNewtonsoftJson() // ... }
روش کار مستقیم با System.Text.Json
اگر در قسمتی از برنامهی خود نیاز به کار مستقیم با اشیاء JSON را داشته باشید و یا حتی بخواهید از این قابلیت در برنامههای کنسول و یا کتابخانهها نیز استفاده کنید، روش انتقال کدهایی که از Json.NET استفاده میکنند به System.Text.Json، به صورت زیر است:
public class Person { public string FirstName { get; set; } public string LastName { get; set; } public DateTime? BirthDay { get; set; } }
using System; using System.Text.Json.Serialization; namespace ConsoleApp { class Program { static void Main(string[] args) { Person person = JsonSerializer.Parse<Person>(...); string json = JsonSerializer.ToString(person); } } }
کلاس JsonSerializer دارای overloadهای زیر برای کار با متدهای Parse و ToString است:
namespace System.Text.Json.Serialization { public static class JsonSerializer { public static object Parse(ReadOnlySpan<byte> utf8Json, Type returnType, JsonSerializerOptions options = null); public static object Parse(string json, Type returnType, JsonSerializerOptions options = null); public static TValue Parse<TValue>(ReadOnlySpan<byte> utf8Json, JsonSerializerOptions options = null); public static TValue Parse<TValue>(string json, JsonSerializerOptions options = null); public static string ToString(object value, Type type, JsonSerializerOptions options = null); public static string ToString<TValue>(TValue value, JsonSerializerOptions options = null); } }
سفارشی سازی JsonSerializer جدید
اگر به امضای متدهای Parse و ToString کلاس JsonSerializer دقت کنید، دارای یک پارامتر اختیاری از نوع JsonSerializerOptions نیز هستند که به صورت زیر تعریف شدهاست:
public sealed class JsonSerializerOptions { public bool AllowTrailingCommas { get; set; } public int DefaultBufferSize { get; set; } public JsonNamingPolicy DictionaryKeyPolicy { get; set; } public bool IgnoreNullValues { get; set; } public bool IgnoreReadOnlyProperties { get; set; } public int MaxDepth { get; set; } public bool PropertyNameCaseInsensitive { get; set; } public JsonNamingPolicy PropertyNamingPolicy { get; set; } public JsonCommentHandling ReadCommentHandling { get; set; } public bool WriteIndented { get; set; } }
// Json.NET: var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; string json = JsonConvert.SerializeObject(person, settings);
// JsonSerializer: var options = new JsonSerializerOptions { IgnoreNullValues = true }; string json = JsonSerializer.ToString(person, options);
در برنامههای ASP.NET Core که این نوع متدها در پشت صحنه فراخوانی میشوند، روش تنظیم JsonSerializerOptions به صورت زیر است:
services.AddControllers() .AddJsonOptions(options => options.JsonSerializerOptions.WriteIndented = true);
نگاشت نام ویژهی خواص در حین عملیات deserialization
در مثال فوق، فرض شدهاست که نام خاصیت BirthDay، دقیقا با اطلاعاتی که از رشتهی JSON دریافتی پردازش میشود، تطابق دارد. اگر این نام در اطلاعات دریافتی متفاوت است، میتوان از ویژگی JsonPropertyName برای تعریف این نگاشت استفاده کرد:
[JsonPropertyName("birthdate")] public DateTime? BirthDay { get; set; }
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; string json = JsonSerializer.ToString(person, options);
در این بین اگر نمیخواهید خاصیتی در عملیات serialization و یا برعکس آن پردازش شود، میتوان از تعریف ویژگی [JsonIgnore] بر روی آن استفاده کرد.