Trình chuyển JSON sang Dart

Bước 1 / 333%

Tạo các lớp mô hình Dart không cần thư viện phụ thuộc từ một đối tượng JSON hoặc một mảng các đối tượng mẫu. Trình chuyển sẽ hợp nhất mọi phần tử mẫu, tạo lớp lồng nhau, giữ nguyên khóa JSON ban đầu và sinh kiểu trường null-safe chính xác cùng factory constructor fromJson. Bạn có thể thêm phương thức toJson khi cần đầu ra tương thích với jsonEncode. Mẫu và mã được tạo chỉ nằm trong trình duyệt này, không được tải lên hay đưa vào URL.

Cách hoạt động

  1. 1

    Dán mẫu có tính đại diện

    Dùng một đối tượng JSON hoặc một mảng đối tượng. Nhiều phần tử giúp phát hiện các trường bị thiếu, có thể nhận null hoặc có kiểu hỗn hợp.

  2. 2

    Chọn tùy chọn Dart

    Đặt tên lớp gốc, chọn có để mọi trường nhận null hay không và thêm phương thức toJson nếu cần.

  3. 3

    Kiểm tra và xuất

    Xem lại các lớp được suy luận, sau đó sao chép mã hoặc tải tệp models.dart về máy.

Cách JSON được chuyển thành mô hình Dart null-safe

Tài liệu dart:convert chính thức giải thích rằng jsonDecode() tạo ra các giá trị tương thích với JSON như số, chuỗi, Boolean, null, danh sách và map có khóa dạng chuỗi. Không thể mã hóa trực tiếp một lớp mô hình thành JSON, nhưng jsonEncode() có thể gọi phương thức toJson() của lớp đó. Trình chuyển này tạo mẫu tuần tự hóa thủ công mà không thêm annotation json_serializable hay thư viện phụ thuộc.

Giả sử mẫu có một người dùng với địa chỉ lồng nhau. User được tạo sẽ có các trường final và constructor dùng tham số có tên. User.fromJson(Map<String, Object?> json) ép kiểu các giá trị đơn và gọi UserAddress.fromJson() cho đối tượng lồng nhau. Nếu address bị thiếu hoặc là null trong bất kỳ đối tượng mẫu nào, kiểu của nó sẽ thành UserAddress? và factory kiểm tra null trước khi khởi tạo. Khi bật toJson, các mô hình lồng nhau được chuyển đệ quy thành map mà jsonEncode() chấp nhận.

Giá trị quan sát trong JSON Kiểu Dart được tạo
Số nguyên int
Số thập phân double
Có cả mẫu nguyên và thập phân num
Văn bản String
Giá trị logic bool
Đối tượng lồng nhau Lớp mô hình được tạo
Mảng đồng nhất List<T>
Mảng lồng rỗng hoặc không tương thích List<Object?>
Chỉ có null hoặc các giá trị xung đột Object?

Trình chuyển kiểm tra mọi đối tượng trong mảng gốc thay vì chỉ tin vào phần tử đầu tiên. Một trường sẽ có thể nhận null nếu bị thiếu ở một phần tử hoặc có giá trị null rõ ràng. Bạn cũng có thể cho phép mọi trường nhận null khi API thực tế khó đoán hơn mẫu. Hướng dẫn null safety của Dart nêu rằng kiểu mặc định không nhận null và cần ? để chấp nhận null.

Xử lý định danh và giới hạn suy luận

Khóa JSON không nhất thiết phải là tên thành viên Dart hợp lệ. Dấu câu được loại bỏ, các từ được chuyển sang lowerCamelCase, từ khóa dành riêng nhận hậu tố an toàn và tên trùng nhận hậu tố số ổn định. Khóa ban đầu vẫn được giữ nguyên trong json['original-key'] và map toJson(). Tên lớp lồng nhau dùng đường dẫn đầy đủ để các đối tượng địa chỉ không liên quan không vô tình bị gộp thành một lớp.

Một mẫu không thể chứng minh toàn bộ hợp đồng API. Chuỗi JSON không tự động được coi là ngày, UUID hoặc enum, còn mảng rỗng không cung cấp kiểu phần tử. Tên thành viên đối tượng bị lặp cũng không an toàn khi chuyển đổi hai chiều vì trình phân tích JSON thường chỉ giữ giá trị cuối. Hãy đối chiếu mô hình được tạo với tài liệu hoặc schema API trước khi dùng trong production. Công cụ giới hạn kích thước đầu vào, độ sâu lồng nhau, số khai báo được suy luận và kích thước đầu ra để kiểm soát khối lượng xử lý trong trình duyệt.

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

Không. Việc phân tích, suy luận, tạo mã, sao chép và tải xuống đều diễn ra trong trình duyệt. JSON và mã Dart được tạo không được gửi qua máy chủ của chúng tôi hay đưa vào URL.

Có. Flutter sử dụng Dart, vì vậy các lớp không cần thư viện phụ thuộc này có thể dùng trong dự án Flutter. Trước tiên, hãy đối chiếu kiểu được suy luận với hợp đồng API thực tế.

Không. Công cụ tạo fromJson thủ công và phương thức toJson tùy chọn mà không phụ thuộc vào package hay build_runner.

Trường được quan sát là null hoặc bị thiếu sẽ có thể nhận null. Bạn có thể chọn cho phép mọi trường được tạo nhận null nếu mẫu không đại diện đầy đủ cho dữ liệu.

Không. Kết quả chỉ phản ánh các giá trị đã quan sát. Hãy dùng nhiều đối tượng mẫu và so sánh kết quả với schema hoặc tài liệu của nhà cung cấp.

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