Cấu hình AddNewtonsoftJson cho Web API .NET Core xuất dữ liệu JSON

Trong các ứng dụng Web API hiện đại, định dạng JSON là chuẩn mặc định cho dữ liệu đầu ra. Tuy nhiên từ .NET Core 3.0 trở lên, hệ thống sử dụng System.Text.Json làm trình định dạng mặc định thay vì Newtonsoft.Json. Để khai thác tính năng quen thuộc của thư viện Newtonsoft.Json, cần thực hiện cấu hình chuyên biệt.

Ví dụ minh họa

[Route("user-info")]
[HttpGet]
public ActionResult<JObject> GetUserInfo()
{
    var userInfo = new
    {
        UserId = 1,
        FullName = "Nguyễn Văn A",
        Location = "Hà Nội",
        Timestamp = DateTime.Now
    };
    return JObject.FromObject(userInfo);
}

Endpoint này sẽ trả về kết quả không đúng định dạng mong đợi khi chưa cấu hình, do System.Text.Json không xử lý được kiểu JObject.

Thiết lập trình định dạng JSON

Thêm gói Microsoft.AspNetCore.Mvc.NewtonsoftJson vào dự án và cấu hình trong lớp Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
            .AddNewtonsoftJson(jsonOptions =>
            {
                // Áp dụng camelCase cho tên thuộc tính
                jsonOptions.SerializerSettings.ContractResolver 
                    = new CamelCasePropertyNamesContractResolver();
                
                // Định dạng ngày giờ theo chuẩn Việt Nam
                jsonOptions.SerializerSettings.DateFormatString 
                    = "dd-MM-yyyy HH:mm";
                
                // Bỏ qua giá trị null khi serializing
                jsonOptions.SerializerSettings.NullValueHandling 
                    = NullValueHandling.Ignore;
                
                // Ngăn lỗi tham chiếu vòng
                jsonOptions.SerializerSettings.ReferenceLoopHandling 
                    = ReferenceLoopHandling.Ignore;
            });
}

Các thiết lập trên cho phép:

  • Chuyển đổi tên thuộc tính thành camelCase (userId thay vì UserId)
  • Định dạng thời gian nhất quán theo múi giờ địa phương
  • Loại bỏ trường dữ liệu null không cần thiết
  • Xử lý các cấu trúc dữ liệu phức tạp có quan hệ vòng

Đối với các trường hợp cần xử lý đặc biệt với DateTime, có thể sử dụng lớp chuyển đổi tùy chỉnh:

jsonOptions.SerializerSettings.Converters.Add(
    new CustomDateTimeConverter("HH:mm dd/MM/yyyy"));

Việc cấu hình này đặc biệt quan trọng khi làm việc với các hệ thống kế thừa hoặc yêu cầu tương thích với thư viện xử lý JSON truyền thống. Tài liệu chính thức về cơ chế định dạng dữ liệu có thể tham khảo tại đây.

Thẻ: dotnet-core web-api newtonsoft-json json-serialization aspnet-core

Đăng vào ngày 23 tháng 6 lúc 14:32