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.