JSON sang TypeScript, Go, Python, PHP, Rust
Riêng tư theo thiết kế — chạy hoàn toàn trong trình duyệt của bạn
Suy luận các định nghĩa kiểu chính xác từ một phản hồi API thực tế là một trong những công việc lẽ ra chỉ tốn năm giây nhưng lại ngốn mười lăm phút. Công cụ này đọc một mẫu JSON trong trình duyệt của bạn, duyệt qua cấu trúc và phát ra các kiểu mang tính ngữ pháp của ngôn ngữ cho TypeScript, Go, Python, PHP hoặc Rust — với trường tùy chọn, phát hiện ngày ISO, và phân biệt đúng đắn giữa số nguyên và số thực.
Cách suy luận hoạt động
Công cụ duyệt cây JSON một lần, xây dựng một biểu diễn trung gian: nguyên thủy trở thành string / int / float / bool / null, mảng suy ra kiểu phần tử từ hợp của các thành viên, và đối tượng tạo thành một struct mà các kiểu trường lấy từ giá trị. Khi cùng một trường xuất hiện ở một số phần tử mảng nhưng không ở các phần tử khác, nó được đánh dấu tùy chọn — kiểu được tạo có thể giải mã dữ liệu một phần mà không phá vỡ. Số không có phần phân số được phát ra là int64 (Go) / int (Python) / i64 (Rust), và số có phần phân số là float64 / float / f64. Chuỗi khớp với ISO 8601 (`2024-03-15T10:30:00Z`) trở thành Date / time.Time / datetime / DateTimeInterface / chrono::DateTime.
Phong cách đầu ra theo ngôn ngữ
Mỗi bộ phát tuân theo quy ước của ngôn ngữ đích. TypeScript: các interface được xuất với cú pháp `?:`. Go: struct với tag `json:`, trường tùy chọn là con trỏ với `omitempty`. Python: `@dataclass` với trường bắt buộc trước và `Optional[T] = None` ở cuối (quy tắc thứ tự dataclass). PHP: class final với kiểu nghiêm ngặt và gợi ý phpdoc `@var list<T>` cho mảng có kiểu. Rust: struct với `#[derive(Serialize, Deserialize)]`, `Option<T>` cho trường nullable, và `#[serde(rename)]` khi tên snake_case trong Rust khác với khóa JSON.
Khi nào nên dùng (và khi nào không)
Bộ tạo này giải quyết 80% công việc đầu: lấy định nghĩa kiểu hoạt động từ một payload trong vài giây. Nó không thay thế một schema viết tay khi bạn cần các ràng buộc chính xác (regex trên chuỗi, min/max trên số, union phân biệt). Trong những trường hợp đó, lấy đầu ra làm điểm khởi đầu và thắt chặt các kiểu. Việc phát hiện trường tùy chọn là heuristic — dựa trên những gì có trong mẫu — vì vậy hãy cho qua nhiều mẫu đa dạng nếu có thể.
Câu hỏi thường gặp
- JSON tôi dán có rời khỏi trình duyệt của tôi không?
- Không. Trình phân tích cú pháp, suy luận kiểu, và phát mã đều chạy trong JavaScript trong tab của bạn. Mở bảng Network khi bạn tạo — bạn sẽ thấy không có yêu cầu đi ra nào. An toàn cho payload sản xuất với token thực và PII.
- Tại sao trường của tôi được đánh dấu tùy chọn dù nó luôn có giá trị?
- Cờ tùy chọn được đặt khi một mảng chứa các đối tượng có trường đó và một số không có. Nếu bạn dán một đối tượng duy nhất, không gì được đánh dấu tùy chọn. Nếu bạn dán một mảng các đối tượng giống nhau, cũng vậy. Cờ chỉ kích hoạt khi cấu trúc trong mảng thay đổi.
- Số nguyên và số thực được phân biệt thế nào?
- JSON chỉ có một kiểu số. Công cụ kiểm tra từng giá trị và phát ra int khi giá trị không có phần phân số (`42`, `1000`) và float khi có (`3.14`, `99.0`). Nếu một mảng trộn cả hai, kiểu được mở rộng thành float để tránh giải mã có mất.
- Nó có phát hiện chuỗi ngày ISO không?
- Có. Các chuỗi khớp với `YYYY-MM-DD` hoặc `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` được phát ra dưới dạng kiểu ngày/giờ gốc của ngôn ngữ (Date trong TS, time.Time trong Go, datetime trong Python, DateTimeInterface trong PHP, chrono::DateTime trong Rust). Các định dạng khác giữ nguyên là string.
- Tôi có cần cài đặt gì để dùng mã được tạo không?
- TypeScript: không, thuần. Go: chỉ thư viện chuẩn (time.Time khi có ngày ISO). Python: module dataclasses chuẩn. PHP: kiểu native. Rust: cần serde + chrono nếu có ngày ISO. Header/import được viết vào đầu ra khi áp dụng.
- Tôi có thể tạo kiểu cho một mảng đối tượng ở root không?
- Có. Nếu giá trị root là một mảng đối tượng, công cụ phát ra một struct cho phần tử và một alias kiểu cấp cao nhất cho mảng. Ví dụ, JSON `[{...}, {...}]` đặt tên `Users` tạo ra interface `User` cộng với `type Users = User[];` trong TypeScript, hoặc `pub type Users = Vec<User>;` trong Rust.