Đổi JSON thành mảng PHP hoặc class PHP 8 có kiểu
Công cụ JSON to PHP làm hai việc. Thứ nhất, đổi JSON thành mảng PHP viết sẵn trong mã, cú pháp [] ngắn, thụt lề gọn, chuỗi được thoát đúng quy tắc của PHP, cho kết quả giống json_decode($json, true). Thứ hai, sinh class PHP 8 có typed properties, constructor property promotion, readonly tùy chọn và hàm fromArray dựng cả lớp con từ mảng giải mã. Kiểu được suy từ toàn bộ mẫu, trường có thể vắng hay null thành kiểu nullable.
Tính năng nổi bật
- Chế độ Mảng PHP: in JSON thành mảng PHP lồng nhau với cú pháp [] (PHP 5.4+) hoặc array() cho mã cũ, mỗi cấp thụt 4 dấu cách, dấu phẩy cuối dòng
- Thoát chuỗi đúng quy tắc PHP: chuỗi thường dùng nháy đơn nên $ và {$x} giữ nguyên chữ; chuỗi có xuống dòng, tab, ký tự điều khiển chuyển sang nháy kép với \n, \t, \e, \u{...} và $ thoát thành \$
- Giữ đúng chữ số gốc của JSON (1.0 vẫn là 1.0, 1e5, số nguyên rất lớn), object rỗng {} thành mảng rỗng, tương đương json_decode($json, true)
- Tùy chọn ẩn hoặc hiện chỉ số 0 =>, 1 => của mảng tuần tự, đặt tên biến, bật tắt thẻ <?php
- Chế độ Class PHP 8: typed properties int, float, bool, string, array, mixed và class con; trường có thể vắng hoặc null ra ?string, ?Order với mặc định null
- Constructor property promotion (PHP 8.0) hoặc kiểu cũ khai báo thuộc tính rồi gán trong constructor (PHP 7.4+); tùy chọn readonly (PHP 8.1), final, declare(strict_types=1), namespace
- Hàm fromArray dựng đối tượng từ mảng json_decode: gọi Order::fromArray cho lớp con, array_map cho mảng lớp con kể cả mảng lồng mảng, isset cho lớp con có thể vắng
- Docblock @param list<Order>, array<string, mixed> cho thuộc tính kiểu array để PHPStan, Psalm và IDE biết kiểu phần tử
- Tham số bắt buộc xếp trước tham số có giá trị mặc định để tránh cảnh báo deprecated của PHP 8; gọi new self(...) bằng đối số có tên khi dùng promotion
- Đổi khóa sang camelCase hoặc giữ khóa gốc khi là tên hợp lệ; tên lớp tránh từ khóa và kiểu dựng sẵn như List, Match, Array (PHP so tên lớp không phân biệt hoa thường)
- Mã cập nhật ngay khi gõ, mở file .json, sao chép, tải file .php; chạy hoàn toàn trên trình duyệt
Khi nào cần đổi JSON sang PHP
Lập trình viên PHP thường gặp JSON ở hai chỗ. Một là dữ liệu cố định cần đưa vào mã: cấu hình mẫu, danh sách tỉnh thành, dữ liệu cho test hay seeder. Đọc file JSON mỗi lần chạy thì thêm một bước I/O và một chỗ có thể lỗi, còn chép tay sang mảng PHP thì dễ sót dấu phẩy, quên thoát nháy đơn hoặc để $ trong chuỗi nháy kép bị hiểu thành biến. Hai là phản hồi API cần được đọc thành đối tượng có kiểu thay vì mảng kết hợp, để IDE gợi ý tên trường và công cụ phân tích tĩnh bắt lỗi gõ sai khóa. Công cụ xử lý cả hai: chế độ Mảng PHP in ra mảng tương đương json_decode với chuỗi đã thoát đúng, chế độ Class PHP 8 sinh class có kiểu kèm hàm fromArray dựng sẵn mọi lớp con.
Lợi ích khi sử dụng
- Không còn lỗi cú pháp vì thiếu dấu phẩy hay nháy đơn chưa thoát khi chép JSON sang mảng PHP bằng tay
- Chuỗi chứa $ không bị PHP hiểu nhầm thành biến, chuỗi nhiều dòng giữ đúng ký tự xuống dòng
- Class có kiểu giúp IDE gợi ý trường và PHPStan, Psalm bắt lỗi gõ sai khóa mà mảng kết hợp không bắt được
- Hàm fromArray dựng sẵn cả cây đối tượng, không phải viết vòng lặp array_map cho từng mảng lớp con
- Chọn được mức tương thích từ PHP 7.4 đến PHP 8.1 tùy máy chủ đang chạy
- JSON không rời khỏi trình duyệt, an toàn với dữ liệu có thông tin khách hàng
Cách chuyển JSON sang mảng hoặc class PHP
- 1Ở mục Đầu ra, chọn Mảng PHP hoặc Class PHP 8.
- 2Với Mảng PHP: nhập Tên biến, chọn Cú pháp mảng [ ] hoặc array( ), bật tắt Ẩn chỉ số của mảng tuần tự và Thêm thẻ <?php ở đầu.
- 3Với Class PHP 8: nhập Tên class gốc và Namespace, chọn Tên thuộc tính camelCase hoặc giữ khóa gốc, rồi bật tắt Constructor property promotion, Thuộc tính readonly, Hàm fromArray, declare(strict_types=1), final class.
- 4Dán JSON vào ô JSON đầu vào, bấm Mở file .json hoặc Nạp ví dụ; JSON sai cú pháp sẽ báo lỗi kèm số dòng.
- 5Xem kết quả ở ô Mã PHP sinh ra, đọc các dòng chú thích // về phiên bản PHP cần dùng và trường cần sửa kiểu.
- 6Bấm Sao chép mã hoặc Tải file .php để đưa vào dự án.
Quy tắc chuỗi trong PHP mà công cụ áp dụng
PHP có hai loại chuỗi hay dùng. Chuỗi nháy đơn chỉ hiểu hai chuỗi thoát là \' và \\, mọi ký tự khác kể cả $ được giữ nguyên chữ, nên đây là lựa chọn an toàn nhất cho dữ liệu: công cụ dùng nháy đơn cho mọi chuỗi không chứa ký tự điều khiển. Chuỗi nháy kép thì nội suy biến: "Giá $price" sẽ tìm biến $price, "{$x}" chèn giá trị của $x. Nếu chép JSON chứa mã khuyến mãi như $KM50 vào chuỗi nháy kép, PHP sẽ báo biến chưa định nghĩa và in ra chuỗi rỗng ở chỗ đó. Khi chuỗi có xuống dòng, tab hay ký tự điều khiển khác, nháy đơn không biểu diễn gọn được, công cụ chuyển sang nháy kép và thoát đủ: \n, \r, \t, \v, \f, \e cho ký tự ESC, \u{1} cho các mã điều khiển còn lại (cú pháp có từ PHP 7.0), \" cho nháy kép, \\ cho gạch chéo ngược và \$ cho dấu đô la. Chữ tiếng Việt và emoji được giữ nguyên dạng UTF-8.
Mảng PHP sinh ra có giống json_decode không
Có. Mảng sinh ra cho cùng giá trị với json_decode($json, true): object JSON thành mảng kết hợp, mảng JSON thành mảng tuần tự, true, false, null giữ nguyên, object rỗng {} thành mảng rỗng []. Số được ghi đúng chữ số trong JSON, nên 1.0 vẫn là số thực float(1) khi PHP đọc, 1e5 là float, còn số nguyên vượt PHP_INT_MAX (9.223.372.036.854.775.807 trên máy 64 bit) sẽ thành float giống hành vi mặc định của json_decode. Khóa dạng số như "12" được PHP tự đổi thành khóa số nguyên 12, json_decode cũng làm vậy. Khác với var_export: hàm này in kiểu array ( ... ) cũ, luôn ghi chỉ số 0 =>, 1 => và có dấu cách trước ngoặc, còn công cụ in cú pháp [] gọn, thụt lề 4 dấu cách theo PSR-12. Nếu bạn cần giống hệt var_export, chọn array( ) và tắt Ẩn chỉ số.
Class PHP 8: promotion, readonly và phiên bản tối thiểu
Constructor property promotion (PHP 8.0) cho phép khai báo thuộc tính ngay trong tham số hàm khởi tạo, ví dụ public readonly int $userId, nên class ngắn hơn hẳn. Thuộc tính readonly (PHP 8.1) chỉ được gán một lần trong class, sau đó không đổi được, rất hợp với DTO nhận từ API. Nếu máy chủ còn chạy PHP 7.4, hãy tắt cả hai: công cụ sẽ khai báo thuộc tính có kiểu riêng (typed properties có từ 7.4), gán trong constructor và gọi new self(...) bằng đối số theo vị trí thay vì đối số có tên của PHP 8. Kiểu mixed chỉ có từ PHP 8.0; khi kết quả có mixed ở chế độ cũ, công cụ ghi chú thích nhắc bạn. Một quy tắc dễ quên: thuộc tính readonly không được có giá trị mặc định, nên ở chế độ không promotion có readonly, thuộc tính nullable không có = null mà giá trị null được truyền qua constructor.
Hàm fromArray hoạt động thế nào
json_decode trả về mảng lồng nhau, không biết gì về class của bạn. Hàm fromArray nhận mảng đó và gọi new self(...) với từng giá trị đã chuyển đúng kiểu. Trường là object con thì gọi Profile::fromArray($data['profile']). Trường là mảng object thì dùng array_map(static fn (array $v1): Order => Order::fromArray($v1), $data['orders']), mảng lồng mảng thì array_map lồng với biến $v1, $v2 để không trùng nhau. Trường có thể vắng dùng $data['note'] ?? null, còn lớp con có thể vắng dùng isset($data['profile']) ? Profile::fromArray(...) : null để không gọi fromArray với null. Với declare(strict_types=1), PHP vẫn cho truyền số nguyên vào tham số float, nên trường số thực nhận được cả giá trị 250000 lẫn 90000.5. Hàm không kiểm tra hợp lệ dữ liệu: khóa bắt buộc bị thiếu sẽ phát cảnh báo Undefined array key và lỗi kiểu khi truyền null vào tham số không nullable.
Suy kiểu từ mẫu JSON
Cách suy kiểu dùng chung với các công cụ JSON sang C#, Java, Kotlin trên trang. Mọi phần tử của một mảng object được gộp thành một class: khóa có ở mọi phần tử là tham số bắt buộc, khóa vắng ở vài phần tử hoặc có lúc mang null thành kiểu nullable với mặc định null. Số nguyên và số thực lẫn nhau ra float. Mảng luôn khai báo kiểu array vì PHP không có generic, kiểu phần tử ghi trong docblock: list<string>, list<Order>, list<list<Grid>>; object rỗng ghi array<string, mixed>. Trường chỉ có null hoặc lẫn nhiều loại ra mixed kèm chú thích để bạn sửa. Lớp con đặt tên theo khóa, phần tử mảng đổi sang số ít; tên trùng từ khóa hay kiểu dựng sẵn như list, match, array, DateTime được ghép thêm tên lớp cha, vì PHP so tên lớp không phân biệt hoa thường.
Một ví dụ đi từ JSON tới đối tượng
Giả sử API trả về một khách hàng có user_id là 1042, full_name, một object profile chứa address, và mảng orders mà đơn thứ nhất có note còn đơn thứ hai không có. Ở chế độ Class PHP 8, công cụ sinh bốn class: Root, Profile, Address và Order. Root có tham số int $userId, string $fullName, Profile $profile và array $orders kèm docblock list<Order>. Order có int $id, float $total vì tổng tiền có lúc là số lẻ, và ?string $note = null vì đơn thứ hai thiếu khóa note. Trong mã của bạn chỉ cần một dòng: $root = Root::fromArray(json_decode($json, true, 512, JSON_THROW_ON_ERROR)); sau đó $root->orders[0]->total là số float, $root->profile->address->city là chuỗi, IDE gợi ý đủ tên. Cờ JSON_THROW_ON_ERROR (PHP 7.3+) làm json_decode ném JsonException khi JSON hỏng, thay vì lặng lẽ trả về null rồi gây lỗi ở chỗ khác.
Chọn mảng hay class cho từng tình huống
Mảng kết hợp tiện khi dữ liệu chỉ đi qua: đọc vào, sửa vài khóa, ghi ra lại JSON. Nó cũng là định dạng mà nhiều hàm của framework mong đợi, chẳng hạn file cấu hình của Laravel hay Symfony trả về mảng. Nhược điểm là không có gì ngăn bạn gõ sai $data['user_idd']: PHP chỉ phát cảnh báo lúc chạy. Class có kiểu đáng công khi dữ liệu được dùng ở nhiều chỗ trong mã, khi nhiều người cùng làm, hoặc khi bạn chạy PHPStan ở mức nghiêm ngặt: gõ sai tên thuộc tính bị bắt ngay trong IDE. readonly còn đảm bảo không đoạn mã nào vô tình sửa dữ liệu nhận từ API. Một cách làm phổ biến là giữ mảng ở tầng nhận dữ liệu, gọi fromArray một lần ở ranh giới, rồi chỉ truyền đối tượng trong phần nghiệp vụ.
Giới hạn
Công cụ không sinh hàm toArray hay jsonSerialize để ghi ngược ra JSON, không sinh enum PHP 8.1 cho các giá trị chuỗi lặp lại, không đổi chuỗi ngày giờ sang DateTimeImmutable. Mảng PHP xuất ra luôn là mảng kết hợp, không có chế độ đối tượng stdClass như json_decode khi không truyền true. Trên trang không có trình thông dịch PHP để chạy thử mã, nên kết quả được kiểm thử bằng cách đọc ngược mảng sinh ra và so với JSON gốc, còn phần class được rà theo cú pháp. Hãy chạy php -l trên file vừa tải về để kiểm tra cú pháp trên máy của bạn trước khi đưa vào dự án.
Câu hỏi thường gặp (FAQ)
Làm sao chuyển JSON sang mảng PHP?
Chọn Đầu ra là Mảng PHP rồi dán JSON, mảng hiện ngay ở ô kết quả với tên biến $data. Bấm Sao chép mã để dán vào file PHP. Mảng này cho cùng giá trị với json_decode($json, true).
Làm sao đổi JSON sang PHP associative array (mảng kết hợp)?
Trong mã, gọi json_decode($json, true) để nhận mảng kết hợp thay vì stdClass. Nếu muốn mảng đó viết sẵn trong file PHP (cấu hình, dữ liệu mẫu cho test, seeder), chọn Đầu ra là Mảng PHP rồi dán JSON: công cụ JSON to PHP array converter này in ra đúng mảng mà json_decode(..., true) sẽ trả về, với khóa là chuỗi và object rỗng thành []. Chế độ này không cần PHP chạy, bạn chỉ việc sao chép.
JSON to PHP khác gì JSON to C#, JSON to Java hay JSON to TypeScript trên trang?
Các trang dùng chung cách suy kiểu từ mẫu JSON nhưng sinh mã cho ngôn ngữ khác nhau. Riêng trang PHP có thêm chế độ Mảng PHP, thứ mà ngôn ngữ có kiểu tĩnh không có, và chế độ Class PHP 8 với hàm fromArray vì PHP không có sẵn bộ ánh xạ JSON sang đối tượng như Jackson hay System.Text.Json. Backend Laravel hay Symfony dùng trang này; client .NET, Java, frontend TypeScript dùng trang tương ứng.
json_decode trả về object hay array?
Mặc định json_decode trả về đối tượng stdClass cho object JSON. Truyền tham số thứ hai là true thì nhận mảng kết hợp. Chế độ Mảng PHP của công cụ tương đương cách gọi có true; nếu bạn muốn làm việc với đối tượng có kiểu, hãy dùng chế độ Class PHP 8.
Vì sao chuỗi chứa dấu $ lại bị mất khi dán vào PHP?
Trong chuỗi nháy kép, PHP coi $ten là biến và thay bằng giá trị của biến đó, biến chưa có thì ra chuỗi rỗng kèm cảnh báo. Công cụ dùng nháy đơn cho chuỗi thường nên $ giữ nguyên chữ. Khi buộc dùng nháy kép vì chuỗi có xuống dòng, $ được thoát thành \$.
Khác gì so với dùng var_export?
var_export in kiểu array ( ... ) cũ, luôn ghi chỉ số 0 =>, 1 => và cần bạn chạy PHP để có kết quả. Công cụ in cú pháp [] gọn, ẩn chỉ số của mảng tuần tự, chạy ngay trên trình duyệt. Muốn giống var_export hơn, chọn array( ) và tắt Ẩn chỉ số.
Class PHP sinh ra cần PHP phiên bản nào?
Mặc định dùng constructor property promotion và readonly nên cần PHP 8.1. Tắt readonly thì cần PHP 8.0. Tắt cả promotion lẫn readonly thì chạy được trên PHP 7.4, trừ khi có thuộc tính kiểu mixed (cần 8.0), công cụ sẽ ghi chú thích khi gặp trường hợp này.
Hàm fromArray có tự dựng các class con không?
Có. Trường là object con được dựng bằng Ten::fromArray, trường là mảng object được dựng bằng array_map gọi fromArray cho từng phần tử, kể cả mảng lồng mảng. Lớp con có thể vắng mặt được kiểm tra bằng isset trước khi dựng.
Vì sao thuộc tính mảng chỉ có kiểu array?
PHP chưa có generic nên không khai báo được array<Order> trong mã. Công cụ ghi kiểu phần tử vào docblock @param list<Order>, đây là cú pháp mà PHPStan, Psalm và PhpStorm đều hiểu để gợi ý và kiểm tra kiểu.
Có nên bật declare(strict_types=1) không?
Nên bật với mã mới: PHP sẽ báo lỗi TypeError khi truyền sai kiểu thay vì tự ép, ví dụ chuỗi "12" vào tham số int. Ngoại lệ duy nhất là số nguyên vẫn được truyền vào tham số float. Nếu dữ liệu API hay trả số dưới dạng chuỗi, hãy tắt tùy chọn hoặc ép kiểu trong fromArray.
Trường có lúc vắng mặt được khai báo thế nào?
Trường không có ở mọi phần tử của mảng, hoặc có lúc mang null, được khai báo nullable như ?string $note = null và đọc bằng $data['note'] ?? null trong fromArray. Tham số này được xếp sau các tham số bắt buộc để PHP 8 không báo deprecated.
Khóa JSON có gạch dưới hay có dấu tiếng Việt thì tên thuộc tính ra sao?
Mặc định đổi sang camelCase: user_id thành $userId, "họ tên" thành $hoTen, còn fromArray vẫn đọc đúng khóa gốc. Chọn Giữ khóa gốc khi hợp lệ nếu dự án quen dùng $user_id; khóa có ký tự không hợp lệ vẫn được đổi.
Số nguyên lớn có bị sai không?
Ở chế độ mảng, số được ghi đúng chữ số gốc. Số vượt PHP_INT_MAX sẽ bị PHP đọc thành float và mất độ chính xác, giống json_decode; muốn giữ nguyên thì dùng json_decode với cờ JSON_BIGINT_AS_STRING và để dạng chuỗi. Ở chế độ class, trường đó được khai báo float kèm chú thích.
Có chuyển được mảng PHP ngược lại sang JSON không?
Công cụ này chỉ đi một chiều từ JSON sang PHP. Để ra JSON từ mảng PHP, gọi json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) trong PHP. Cờ JSON_UNESCAPED_UNICODE giữ chữ tiếng Việt thay vì đổi thành \u.
Object rỗng {} được chuyển thành gì?
Ở chế độ mảng, {} thành [] giống json_decode($json, true). Ở chế độ class, object rỗng không có gì để suy nên thành thuộc tính array với docblock array<string, mixed>, hợp với các trường metadata có khóa động.
Có dùng được cho Laravel không?
Được. Mảng PHP dán thẳng vào file trong thư mục config, seeder hoặc test. Class sinh ra là DTO thuần, không phụ thuộc framework, có thể đặt trong app/Data hay app/Dto và gọi Root::fromArray($request->json()->all()) hoặc từ $response->json() của HTTP client.
Mảng PHP có giữ thứ tự khóa như trong JSON không?
Có. Công cụ in khóa theo đúng thứ tự xuất hiện trong JSON và mảng PHP giữ thứ tự chèn. Riêng khi một object có hai khóa trùng tên, giá trị sau đè giá trị trước nhưng vẫn ở vị trí của khóa đầu tiên, giống cách trình phân tích JSON thông thường xử lý.
Khóa JSON trùng từ khóa PHP như class, list, match có sao không?
Tên thuộc tính thì không sao, vì thuộc tính và biến có dấu $ đứng trước nên được phép trùng từ khóa, ví dụ $class hay $list. Tên class thì không được trùng từ khóa, nên object con nằm dưới khóa list sẽ thành class RootList thay vì List. Riêng khóa this được đổi thành $this_ vì PHP không cho tham số hay thuộc tính promotion tên $this.
Có tùy chỉnh được thụt lề không?
Hiện công cụ thụt mỗi cấp 4 dấu cách theo PSR-12 và không có tùy chọn khác. Nếu dự án dùng tab hoặc 2 dấu cách, hãy chạy PHP CS Fixer hay định dạng lại bằng IDE sau khi dán.
Dữ liệu JSON có được gửi lên máy chủ không?
Không. JSON được đọc và chuyển đổi bằng JavaScript ngay trên trình duyệt. Trang không lưu nội dung bạn dán, đóng tab là mất.
Mã sinh ra đã được chạy thử bằng PHP chưa?
Trang không có trình thông dịch PHP. Phần mảng được kiểm thử bằng cách đọc ngược kết quả theo quy tắc chuỗi của PHP và so với JSON gốc, phần class được rà cú pháp qua nhiều ca mẫu. Hãy chạy php -l ten-file.php trên máy để kiểm tra trước khi dùng.
Từ khóa liên quan
- json to php array
- json to php array online
- json to php
- json to php array converter
- json to php object
- json to php online
- json to php associative array
- json to php class
- json to php array converter online
- chuyển json sang mảng php
- json sang array php
- json_decode to array
- json to php 8 class
- json to php dto
- php array from json
- convert json to php array
- json to var_export
- json to php short array syntax
- tạo class php từ json
- json to php readonly class
- json to laravel array
- json to php constructor promotion