Từ JSON đến lớp C#

Dán một mẫu JSON để nhận các lớp POCO trong C# sẵn sàng dùng cho việc chèn vào tệp .cs. Hệ thống tự động chọn các kiểu dữ liệu phù hợp, xử lý đối tượng lồng nhau với các định nghĩa lớp bổ sung, hỗ trợ các kiểu tham chiếu có thể bỏ trống, và tạo ra thuộc tính System.Text.Json hoặc Newtonsoft.Json tùy theo yêu cầu của dự án.

Cách chuyển đổi JSON sang C#

  1. 1

    Dán JSON

    Chỉ cần một mẫu là đủ; sử dụng nhiều mẫu sẽ giúp cải thiện khả năng suy luận đối với các giá trị có thể bị bỏ trống và các phần tử trong mảng.

  2. 2

    Chọn phong cách

    System.Text.Json (.NET 6+) hoặc Newtonsoft.Json (phiên bản cũ). Các tên thuộc tính PascalCase kèm `[JsonPropertyName]` cho JSON ở định dạng camelCase.

  3. 3

    Chọn phiên bản C# mục tiêu

    C# 10+ dành cho không gian tên trong bản ghi và tệp tin; C# 8 dành cho các kiểu tham chiếu có thể bị bỏ sót (nullable); hoặc các phiên bản cũ hơn để đảm bảo tính tương thích tối đa.

  4. 4

    Sao chép các lớp

    Một lớp gốc cùng các lớp con dành cho từng hình dạng đối tượng, tất cả đều được lưu trong một tệp duy nhất và sẵn sàng để sử dụng ngay trong dự án của bạn.

Ví dụ về kết quả đầu ra

Đối với dữ liệu đầu vào:

{ "firstName": "Alice", "age": 30, "emails": ["a@a.com"], "address": { "city": "Madrid" } }

Kết quả đầu ra System.Text.Json (C# 10+):

public class User
{
    [JsonPropertyName("firstName")]
    public string FirstName { get; set; } = default!;

    [JsonPropertyName("age")]
    public int Age { get; set; }

    [JsonPropertyName("emails")]
    public List<string> Emails { get; set; } = new();

    [JsonPropertyName("address")]
    public Address Address { get; set; } = default!;
}

public class Address
{
    [JsonPropertyName("city")]
    public string City { get; set; } = default!;
}

Xác định kiểu dữ liệu

JSON Loại C#
chuỗi văn bản string
số nguyên int (hoặc long nếu giá trị lớn hơn int.MaxValue)
số (thập phân) double (hoặc decimal nếu được chọn)
giá trị luận lý bool
null object? (hoặc hợp nhất với trường liền kề)
ngày ISO-8601 DateTime (hoặc DateOnly)
Chuỗi dạng GUID Guid
mảng chuỗi List<string>
đối tượng lớp lồng ghép

Các tùy chọn thuộc tính

  • System.Text.Json ([JsonPropertyName("foo")]) – được ưu tiên cho các dự án .NET 6+ và các dự án mới.
  • Newtonsoft.Json ([JsonProperty("foo")]) – dùng cho các dự án cũ hoặc khi cần các tính năng riêng của Newtonsoft.
  • Không có, tên thuộc tính trùng khớp hoàn toàn với các khóa JSON (chỉ hoạt động khi các khóa JSON đã ở định dạng PascalCase).

Các lỗi phổ biến

  • Sử dụng int cho trường có nguy cơ vượt giới hạn giá trị. Nếu dữ liệu JSON của bạn chứa các giá trị lớn hơn int.MaxValue, hãy sử dụng long. Bộ tạo sẽ tự động chuyển sang sử dụng long khi phát hiện các giá trị lớn. – Thiếu [JsonIgnore] đối với các thuộc tính tính toán. Nếu bạn thêm các thuộc tính hỗ trợ vào lớp được tạo ra, hãy gắn [JsonIgnore] cho chúng; nếu không, chúng sẽ được tuần tự hóa khi xuất ra. – Bỏ qua việc phân tích không phụ thuộc vào văn hóa. Các trường của decimal cần được giải mã bằng CultureInfo.InvariantCulture; System.Text.Json thực hiện điều này mặc định, trong khi Newtonsoft sử dụng thiết lập toàn cục để thực hiện.
  • Đặt niềm tin vào bộ sinh dữ liệu chỉ dựa trên một mẫu duy nhất. Các tính chất như khả năng bị xóa bỏ (nullable) và loại dữ liệu của các phần tử mảng sẽ được suy đoán từ những gì bộ sinh dữ liệu nhận được. Luôn kiểm tra tính hợp lý của các chú thích về tính khả năng bị xóa bỏ so với hành vi thực tế của API.

Câu hỏi thường gặp

Đối với các dự án mới trên .NET 6+ hãy sử dụng System.Text.Json – phương thức này nhanh hơn, được tích hợp sẵn và hiện hỗ trợ gần như mọi tính năng của Newtonsoft. Đối với các dự án cũ hoặc khi cần sử dụng các tính năng cụ thể của Newtonsoft (như bộ giải quyết hợp đồng tùy chỉnh, JObject và xử lý động), hãy dùng Newtonsoft.

Trong C# 10+, các đối tượng kiểu dữ liệu (DTO) không thể thay đổi được thường được biểu diễn bằng các bản ghi – cách này đảm bảo tính tương đương về giá trị và cú pháp ngắn gọn. Các lớp lại phù hợp hơn khi cần khả năng biến đổi hoặc tương thích với hệ thống cũ. Công cụ cho phép bạn lựa chọn phương án phù hợp tùy theo yêu cầu.

Nếu dự án của bạn sử dụng các kiểu tham chiếu có thể là null (C# 8+), các trường được ghi nhận là null trong mọi mẫu dữ liệu sẽ được đánh dấu là string?, int?, v.v. Nếu không sử dụng NRT, tính khả năng là null chỉ được báo hiệu đối với các kiểu giá trị (ví dụ: int?).

Các mảng hỗn hợp gồm các đối tượng có hình dạng khác nhau không thể được biểu diễn trực tiếp trong C# có kiểu dữ liệu rõ ràng. Công cụ sẽ tự động suy luận một lớp cơ sở chung hoặc lớp dự phòng là object; đối với các mảng hỗn hợp, bạn thường cần thiết kế lại định nghĩa JSON.

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác