logo
GeekFormat

JSON 轉 PHP

免費線上 JSON 轉 PHP 工具,把 JSON 一鍵轉成可直接執行的 PHP 類別。支援 ArrayObject 與 stdClass 兩種風格,自動生成 namespace、typed properties(PHP 7.4+)、可選 readonly class(PHP 8.1+)、implements JsonSerializable,巢狀物件自動拆分為獨立類別,陣列自動轉為 PHP array,本機瀏覽器執行,無需上傳。

相關推薦

關於 JSON 轉 PHP class 與 PHP 實體類別建模

JSON 轉 PHP 工具(JSON to PHP Converter)是一種把 JSON 資料結構自動轉換為標準 PHP 類別程式碼的實用工具。它把開發者從手寫 namespace / class / public 屬性 / 建構器的重複勞動中解放出來,特別適合把 API 介面文件中的範例 JSON 快速轉為可直接 require 進 Composer 專案的 PHP 實體類別。

本工具支援 4 種主流程式碼風格:① ArrayObject 風格(extends \ArrayObject,支援陣列存取與物件存取,Laravel / Symfony Serializer 生態常用);② stdClass 風格(extends \stdClass,僅支援物件存取,WordPress / json_decode 預設行為);③ readonly class 風格(PHP 8.1+ final readonly class,建構期後不可變,適合 DTO);④ Laravel 整合風格(implements Jsonable + Arrayable,配合 Eloquent API Resource)。開發者可根據專案使用的框架自由選擇。

PHP 類型映射是 JSON 轉 PHP 的核心。工具會把 JSON 的基本型別映射到 PHP 的標準型別:字串映射為 string,整數映射為 int,浮點數映射為 float,布林值映射為 bool,陣列映射為 array,巢狀物件映射為獨立的 class(按欄位名首字母大寫),null 映射為 ?type(可空屬性)。所有屬性使用 PHP 7.4+ 的 typed properties 宣告,IDE 可直接做型別檢查。

另一個差異化亮點是「自動實作 JsonSerializable 介面」:每個生成的 PHP 類別都自動 implements \JsonSerializable 並生成 public function jsonSerialize(): mixed { return [...] } 方法。這意味著你可以直接 echo json_encode($user) 輸出 JSON 字串,而 json_encode 會自動呼叫 jsonSerialize() 返回的陣列資料。在 Laravel 中配合 Jsonable 介面還能直接 return response()->json($user),無需任何額外處理。

與一些需要把 JSON 上傳到伺服器處理的線上工具不同,本工具的所有計算都在瀏覽器內完成。quicktype-core 透過 Web Worker 載入和執行,JSON 解析、型別推斷、PHP 程式碼生成、ZIP 打包都在本機進行,不向任何伺服器發送資料。這對於包含 API key、使用者隱私欄位或未上線業務結構的 JSON 尤為重要,關閉頁面後資料即從記憶體中清除。

生成的程式碼通常需要放到 Composer 專案中使用。你需要在 composer.json 中確保 PHP 版本滿足要求(PHP 7.4+ 支援 typed properties,PHP 8.1+ 支援 readonly class),然後把生成的 class 複製到 src 目錄下,透過 namespace 自動載入(PSR-4)。之後就可以用 json_decode($jsonString, false) 或 json_decode($jsonString, true) + 反序列化做資料消費,享受 PHP 類型系統的便利。

適用場景

  • Laravel 後端開發:把 API 介面文件的範例 JSON 快速轉為 Eloquent Model / API Resource 類別,配合 Laravel 內建 Jsonable / Arrayable 介面直接序列化回應
  • Symfony Serializer 整合:把第三方 API 返回的 JSON 轉為 ArrayObject 風格 PHP 類別,配合 Symfony Serializer 做深度的物件映射與資料校驗
  • WordPress REST API:把自訂 endpoint 返回的 JSON 結構轉為 stdClass 風格 PHP 類別,配合 wp_send_json() 直接輸出,匹配 wp_json_encode() 預設行為
  • PHP 8.1+ readonly DTO:把 JSON 轉為 final readonly class 用於資料傳輸物件(DTO),建構期後不可變,避免業務邏輯誤修改回應資料
  • Composer 套件開發:把 JSON Schema 轉成 PHP 類別後釋出到 Packagist 作為 SDK 模型層,供其它 Composer 專案 require 複用
  • 單元測試 fixture:把 JSON fixture 轉成 PHP 類別後用 json_decode + 反序列化做測試資料驅動,斷言結構化欄位
  • 資料移轉指令碼:把 JSON 設定檔轉為 PHP 類別後用於業務邏輯強型別存取,比陣列存取更易 IDE 自動補全與型別檢查
  • 前端 Mock 對接:後端先把 JSON 模型轉 PHP 類別,前端同時拿到對應的 TypeScript interface / PHP class,保持兩端類型一致
  • 程式碼評審:把 API 返回 JSON 直接轉成可讀的 PHP 類別,便於 Code Review 時討論欄位命名、屬性可見性
  • 老專案重構:把基於 array 關聯陣列動態存取的程式碼重構為基於 PHP class 的強型別存取,配合 PHPStan / Psalm 做靜態分析
  • PHPUnit 資料提供器:把 JSON 測試資料轉為 PHP 類別後透過 DataProvider 注入測試案例,IDE 自動提示屬性欄位
  • snake_case 後端 API 接入:後端 API 返回 snake_case 欄位,前端 PHP 系統啟用「轉 camelCase」+ ArrayObject 風格無縫接入
  • PHPStan 靜態分析:生成的類別天然帶型別宣告,配合 phpstan analyse --level=8 在 CI 中攔截型別錯誤
  • 教學與培訓:PHP 教學場景中把範例 JSON 轉 PHP 類別示範物件導向建模、型別系統、介面實作
  • API Gateway 閘道層:把上游微服務返回的 JSON 轉 PHP 類別做閘道層聚合,下游 PHP 服務按類別屬性強型別消費
  • 訊息佇列消費:把 RabbitMQ / Kafka 消費到的 JSON 訊息體轉 PHP 類別後入庫或轉發,配合 JSON_THROW_ON_ERROR 做嚴格解析
  • 電商 SKU / SPU 建模:把商品 JSON 結構(多規格 / 多圖片 / 多屬性)轉 PHP 類別,配套 ArrayObject 風格在 Laravel 中做 N+1 查詢最佳化
  • WebHook 回呼驗簽:把支付閘道、物流回呼的 JSON 驗簽結構轉 PHP 類別,配合 hash_hmac() 做簽名校驗
  • OpenAPI 工具鏈:把 OpenAPI 3.x 的 schema JSON 轉 PHP 類別,對接 Swagger Codegen / Apifox 的 PHP 客戶端生成流程
  • 資料 ETL 管道:把上游資料來源(MySQL JSON 欄位 / MongoDB / Elasticsearch)的 JSON 轉 PHP 類別後做資料清洗與落庫

使用方法

  1. 在左側編輯器貼上 JSON 物件(推薦)或陣列,或點擊「Sample」載入中文範例(含巢狀 address / company / tags)
  2. 點擊工具列「Settings」按鈕,在彈窗中選擇:① 設定根類別名(如 User)和 namespace(如 App\Models);② 選擇程式碼風格(ArrayObject / stdClass / readonly class);③ 選擇程式碼風格(typed properties / Laravel 整合 / Symfony Serializer);④ 選擇欄位命名策略(保持原樣 / camelCase / 全小寫 / UPPER_SNAKE)
  3. 工具會在 400ms 內自動轉換,右側顯示所有生成的 PHP 類別(每個類別一個獨立卡片,標題列即時顯示當前風格徽章);如 JSON 格式錯誤會顯示「修復 JSON」按鈕
  4. 檢查生成的類別名、屬性名和介面是否符合預期;如需調整可修改源 JSON 的 key 名或重新打開 Settings 修改選項
  5. 滿意後可點擊單個類別的「複製」按鈕貼到 IDE,或點擊工具列「Download ZIP」一鍵下載所有類別(按 namespace 路徑組織目錄結構)

功能特點

  • 兩種程式碼風格自由切換:ArrayObject(繼承 \ArrayObject,支援 $obj['key'] 陣列式存取)/ stdClass(繼承 \stdClass,支援 $obj->key 物件式存取),適配 Laravel 序列化、WordPress REST、Symfony Serializer 等不同場景
  • 完整 PHP 範本:自動生成 namespace 宣告 + use 語句 + class 檔頭註解(Copyright + 生成時間戳)+ class 定義 + typed public 屬性(PHP 7.4+),可直接 require 進 Composer 專案,無需手動補樣板
  • JsonSerializable 介面自動實作:每個類別自動生成 public function jsonSerialize(): mixed { return [...] },配合 json_encode() 直接序列化 JSON,零額外樣板程式碼
  • PHP 8.1+ readonly class 可選:開啟後生成的 class 加上 final readonly class,所有屬性為 readonly,建構期後不可變,適合 API 回應 DTO 不可變場景
  • 智慧型別推斷:string → string、integer → int、float → float、bool → bool、array → array、巢狀物件 → 獨立 class、null → ?type(可空屬性),無需手動指定欄位型別
  • 巢狀類別自動拆分:巢狀物件按欄位名首字母大寫生成獨立 PHP 類別(如 address → Address),陣列中的物件按「移除末尾 s」規則命名(如 users → User),所有巢狀類別同樣實作 JsonSerializable
  • 4 種欄位命名策略:保持原樣 / snake_case 轉 camelCase(user_name → userName)/ 全小寫 / UPPER_SNAKE 常數風格,匹配 PSR-1 / Laravel / Symfony 不同程式碼規範
  • Laravel 一鍵整合:勾選後自動 implements Jsonable、Arrayable 介面,新增 toArray() / toJson() 方法,可直接用作 Eloquent API Resource,配合 Composer 自動載入
  • 複製單個類別 + ZIP 多檔案下載:每個 PHP 類別獨立「複製」按鈕,可一鍵下載按 namespace 組織目錄結構的 ZIP 包(如 App/Models/User.php),解壓即用
  • 本機瀏覽器執行 + 歷史記錄:JSON 解析、PHP 類別生成、ZIP 打包都在瀏覽器內透過 JavaScript(quicktype-core + JSZip)完成,資料不上傳任何伺服器;內建 localStorage 歷史記錄最近 200 條輸入

程式碼範例

PHP:用 json_encode() 序列化本工具生成的類別

php

本工具生成的 PHP 類別預設實作 JsonSerializable 介面,配合 json_encode() 直接輸出 JSON,無需任何額外處理。

<?php

require_once 'vendor/autoload.php';

use App\Models\User;

// 模拟从 API 接收到的 JSON 字符串
$jsonString = '{"id":1,"name":"Alice","email":"alice@example.com","isActive":true}';

// 1) 反序列化为本工具生成的类
$userData = json_decode($jsonString, true);
$user = new User(
    $userData['id'],
    $userData['name'],
    $userData['email'],
    $userData['isActive']
);

// 2) 强类型访问字段(IDE 自动补全 + PHPStan 静态检查)
echo $user->name;          // Alice
echo $user->email;         // alice@example.com
echo $user->isActive ? '活跃' : '禁用'; // 活跃

// 3) json_encode() 自动调用 jsonSerialize(),无需任何额外代码
echo json_encode($user, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
/*
{
    "id": 1,
    "name": "Alice",
    "email": "a****@***********",
    "isActive": true
}
*/

PHP:Laravel API Resource 整合範例

php

勾選 Laravel 整合後,本工具生成的類別可直接作為 Eloquent API Resource 使用,配合 toArray() / toJson() 格式化回應。

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * GET /api/users/{id}
     */
    public function show(int $id): JsonResponse
    {
        // 1) 从数据库或外部 API 获取数据
        $userData = $this->fetchUserFromApi($id);

        // 2) 用本工具生成的 User 类包装
        $user = new User(
            $userData['id'],
            $userData['name'],
            $userData['email'],
            $userData['isActive']
        );

        // 3) 直接 return response()->json($user)
        //    Laravel 会自动调用 jsonSerialize()
        return response()->json($user);
    }

    /**
     * POST /api/users
     */
    public function store(Request $request): JsonResponse
    {
        // 4) 反向用法:把请求 JSON 反序列化为 User 类
        $user = User::fromArray($request->all());

        // 5) 用 toArray() 获取数组形式
        $payload = $user->toArray();

        // 6) 执行业务逻辑(如入库 / 调用第三方 API)
        $this->userService->create($payload);

        return response()->json([
            'message' => 'User created',
            'data' => $user,
        ], 201);
    }
}

/*
 * 对应 composer.json 依赖:
 * "require": {
 *     "php": "^8.1",
 *     "laravel/framework": "^11.0"
 * }
 */

PHP:Symfony Serializer 整合範例

php

本工具 ArrayObject 風格生成的類別可配合 Symfony Serializer 元件做深度序列化與反序列化,適合複雜的 API 閘道層。

<?php

namespace App\Service;

use App\Models\User;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Serializer\Normalizer\PropertyNormalizer;

class UserSerializer
{
    private SerializerInterface $serializer;

    public function __construct(SerializerInterface $serializer)
    {
        // 使用 PropertyNormalizer 处理 public 属性
        $this->serializer = $serializer;
    }

    /**
     * 将 User 对象序列化为 JSON 字符串
     */
    public function toJson(User $user): string
    {
        return $this->serializer->serialize($user, 'json');
    }

    /**
     * 将 JSON 字符串反序列化为 User 对象
     */
    public function fromJson(string $json): User
    {
        return $this->serializer->deserialize($json, User::class, 'json');
    }

    /**
     * 批量反序列化(如从 MongoDB 导出的 JSON 数组)
     */
    public function fromJsonArray(string $jsonArray): array
    {
        $users = [];
        $data = json_decode($jsonArray, true);

        foreach ($data as $item) {
            $users[] = User::fromArray($item);
        }

        return $users;
    }
}

// 使用示例
$serializer = new UserSerializer($serializerService);

$json = '{"id":1,"name":"Alice","address":{"city":"Beijing","zip":"100000"},"tags":["php","symfony"]}';

// 反序列化为本工具生成的 User 对象
$user = $serializer->fromJson($json);
echo $user->name;                  // Alice
echo $user->address->city;         // Beijing (强类型访问)
print_r($user->tags);              // ['php', 'symfony']

// 序列化回 JSON
$jsonOutput = $serializer->toJson($user);

最佳实践

對於大多數 PHP 後端專案,ArrayObject 風格生成的類別既能像陣列存取($obj['key']),也能像物件存取($obj->key),加上預設實作的 JsonSerializable 介面,json_encode() 會自動呼叫 jsonSerialize() 返回的陣列。這是 PHP 生態最通用的物件資料載體寫法,相容 Laravel、Symfony、CodeIgniter 等幾乎所有主流框架。

PHP 8.1+ 引入的 readonly class 是 DTO 的最佳實踐:建構期後屬性不可變,避免業務邏輯誤修改回應資料;建構函式提升讓程式碼更精簡(public function __construct(public int $id, public string $name) {} 一行搞定屬性宣告)。建議把 API 回應 DTO、WebHook 回呼結構、第三方 API 客戶端模型都改為 readonly class 風格。

Laravel 資料庫欄位預設是 snake_case,但 PHP 屬性推薦 camelCase。本工具的「轉 camelCase」策略可自動轉換,同時 jsonSerialize() 的 return 陣列 key 保留原 snake_case,json_encode() 輸出仍是 snake_case。這樣既符合 Laravel 模型存取習慣,又保持 API 相容性。

生成的 ZIP 包按 namespace 路徑組織(如 App/Models/User.php)。在 composer.json 配置 autoload.psr-4 段,例如:"App\\": "src/",然後執行 composer dump-autoload。這樣 Composer 會自動把 App\Models\User 映射到 src/Models/User.php,無需手動 require。

本工具預設生成 typed properties(PHP 7.4+),可被 PHPStan 在 --level=8 模式下完整推斷屬性類型。建議在 CI 流水線整合 phpstan analyse ./src --level=8,攔截型別錯誤。Psalm 同樣支援 PropertyTypeProvider 做強型別校驗。

本工具完全本機瀏覽器執行,不會上傳任何資料。但養成習慣:① 包含 API key / token / 使用者隱私的 JSON 應先脫敏再轉換;② 大型內部業務結構(未上線介面)使用本工具時確保網路斷開;③ 不要在生成程式碼後把含敏感資訊的範例資料 commit 到公開倉庫。

巢狀 JSON 物件會遞迴生成獨立 PHP 類別。如果 JSON 巢狀層級超過 6 層(如多層巢狀的選單、組織架構樹、複雜業務單據),生成的類別數量會爆炸(每層 N 個巢狀類別),IDE 載入緩慢且維護困難。建議:① 拆分 JSON 為多個模組分別轉換;② 或在生成後手動重構為陣列索引($user['profile']['address']['city'])而非類別巢狀。

JSON null 值會被預設推斷為 ?mixed(可空 mixed),這是安全兜底但不是精確類型。如確知欄位類型(如 "nickname": "" 推斷為 string),先在源 JSON 給範例值,生成後再刪除範例值並改為 ?string 等精確類型,可大幅提升 PHPStan 靜態分析的準確度。

常見問題

怎麼把 JSON 轉成 PHP class?

將 JSON 內容貼到左側輸入框,工具會在 400ms 內自動轉換;或在工具列點擊「Convert」按鈕。轉換完成後右側會顯示所有生成的 PHP 類別,每個類別有獨立的「複製」按鈕;點擊工具列「Download ZIP」可一鍵打包所有類別下載(含命名空間目錄結構)。

支援哪些 JSON 資料結構?

支援兩種結構:① JSON 物件(作為根類別,自動生成 class RootClass);② JSON 陣列(陣列第一個物件作為根類別範本)。所有巢狀物件會被遞迴處理為獨立類別,陣列中的物件會被遞迴處理為陣列元素型別對應的類別。

生成的 PHP 類別包含什麼內容?

每個生成的 .php 檔案包含:① 檔頭註解(Copyright + 自動生成時間戳);② namespace 宣告;③ use 語句(含 \JsonSerializable / \ArrayAccess 等按需自動匯入);④ class 定義(按設定可能是 ArrayObject / stdClass / readonly class);⑤ implements 介面(按設定包含 JsonSerializable / Jsonable / Arrayable);⑥ typed public 屬性(PHP 7.4+);⑦ 建構函式(按設定生成全屬性賦值);⑧ jsonSerialize() / toArray() / toJson() 等方法。完整可直接 php -l 語法檢查並 require 使用。

ArrayObject 和 stdClass 兩種風格有什麼區別?

ArrayObject 風格:生成的 class extends \ArrayObject,既支援 $obj['key'] 陣列式存取,也支援 $obj->key 物件式存取,json_encode() 時返回物件。stdClass 風格:生成的 class extends \stdClass,僅支援 $obj->key 物件式存取,更輕量但不能直接陣列存取。Laravel / WordPress 生態預設用 stdClass 風格(json_decode 預設行為),Symfony Serializer 預設用 ArrayObject 風格。

支援生成 Laravel API Resource 嗎?

支援。勾選設定中的「Laravel 一鍵整合」選項後,工具會自動生成 implements Jsonable、Arrayable 介面,新增 toJson($options = 0) 和 toArray() 方法,生成的類別可直接在 Eloquent API Resource 中使用(如 new UserResource($user) 或 $user->toArray())。同時自動 use Illuminate\Contracts\Support\Jsonable 和 Illuminate\Contracts\Support\Arrayable。

PHP 8.1 readonly class 模式生成的程式碼長什麼樣?

啟用 readonly class 後,生成的 PHP 類別會顯著精簡。例如 class User 啟用 readonly 後約 12 行:final readonly class User implements \JsonSerializable { public function __construct(public int $id, public string $name) {} public function jsonSerialize(): array { return [...] } }。所有屬性透過建構函式提升(constructor property promotion)宣告為 readonly,建構期後不可變。注意:專案需 PHP 8.1+,readonly 欄位只能透過建構函式賦值。

怎麼把 snake_case 欄位名轉成 camelCase?

在 Settings 彈窗的「欄位命名策略」分組裡選擇「轉 camelCase」模式,工具會自動把 JSON 欄位名從 snake_case 轉為 PHP 推薦命名風格。例如 user_name → userName、created_at → createdAt、is_active → isActive。同時如果 JSON 來自 Laravel 路由綁定,類別屬性會自動透過 $request->userName 直接存取,無需手動中間轉換。

巢狀的 JSON 物件會怎麼處理?

工具會自動為巢狀物件建立獨立的 PHP 類別。命名規則:巢狀物件 key 首字母大寫作為類別名(如 address → Address),陣列中的物件 key 移除末尾 s 後首字母大寫(如 users → User)。所有巢狀類別同樣包含完整欄位、建構函式、jsonSerialize() 方法,namespace 與根類別保持一致,可透過 use App\Models\Address 引入。

陣列欄位會自動轉成什麼?

會。JSON 中的陣列欄位會自動轉換為 PHP array 屬性,元素型別根據陣列第一個元素自動推斷。例如 ["a","b","c"] → array(註解標註 array<string>);[{...},{...}] → array(註解標註 array<User>,User 為根據 key 命名的新類別);空陣列 [] 預設 array(註解標註 array<mixed>)。PHP 8.0+ 配合 PHPDoc 註解可在 IDE 中獲得型別提示。

怎麼修改根類別名和 namespace?

工具列右上角有一個 Settings 按鈕,點擊後彈出設定對話框,可設定:① 根類別名(預設 JsonRootClass);② namespace(預設 App\Models)。修改後所有生成的類別名會同步更新,ZIP 內的目錄結構也會按 namespace 組織(如 App/Models/User.php)。

下載的是單個 .php 檔案還是 ZIP 包?

下載的是 ZIP 包(User.zip),內含所有生成的 PHP 類別,按 namespace 路徑組織目錄結構。例如 namespace 為 App\Models 時,ZIP 內的檔案結構為:App/Models/User.php、App/Models/Address.php、App/Models/Company.php 等。可用 unzip 指令或 IDE 直接匯入 Composer 專案 src 目錄。

可以直接複製單個類別到 IDE 嗎?

可以。每個生成的 PHP 類別顯示為一個獨立的卡片,卡片右上角有「複製」按鈕,點擊後整個類別的完整程式碼(包含 <?php + namespace + use + class + 屬性 + 建構器 + 方法)會被複製到剪貼簿,可直接貼到 PhpStorm / VS Code / Sublime 等 IDE 中。

如何讓生成的類別實作 JsonSerializable 介面?

預設就啟用。所有生成的 PHP 類別自動 implements \JsonSerializable 並生成 public function jsonSerialize(): array { return [...] } 方法,return 的陣列按類別屬性順序組裝。你可以直接 echo json_encode($user) 輸出 JSON 字串,或在 Laravel 中 return response()->json($user)。

Symfony Serializer 能用這個工具生成的類別嗎?

可以。Symfony Serializer 預設使用 array 風格讀取資料,對生成的 ArrayObject 風格類別相容良好。配合 SerializerInterface 的 $serializer->serialize($user, 'json') 可直接序列化,deserialize() 反序列化時需要類別有 public 屬性或 getter。本工具生成的是 public 屬性 + 建構器賦值風格,可直接配合 Symfony Serializer 的 PropertyNormalizer 使用。

JSON 格式錯誤怎麼辦?

工具會自動偵測 JSON 合法性,錯誤時會在右側顯示紅色錯誤提示,並提供「修復 JSON」按鈕。點擊後可自動修復常見錯誤:① 末尾多餘逗號;② 單引號替換為雙引號;③ 缺失引號的 key 補全引號;④ 註解移除。修復成功後可直接轉換生成 PHP 類別。

資料上傳到伺服器嗎?隱私安全嗎?

完全本機瀏覽器執行。所有 JSON 解析、PHP 類別生成、ZIP 打包都在你的瀏覽器內透過 JavaScript(quicktype-core + JSZip)完成,輸入的 JSON 資料和生成的 PHP 程式碼都不會被上傳到任何伺服器,也不會被記錄或快取到雲端。包含內部介面欄位、未上線業務結構、未公開 API 回應的敏感 JSON 都可以放心使用,關閉頁面即清除。

生成 1 萬行的大 JSON 會不會卡?

工具無顯式行數限制,但瀏覽器對超大 JSON 的解析和渲染會變慢。建議:① 拆分 JSON 後批次轉換;② 一次只關注一個巢狀層級;③ 如需批次生成 100+ 類別,建議直接使用 IDE 的 PHP 範本外掛或寫一個簡單的 quicktype CLI 指令碼處理。

生成的 PHP 類別支援 PHP 7.4 以下版本嗎?

不完全支援。本工具生成的類別預設使用 PHP 7.4+ 的 typed properties(如 public int $id)。如果你的專案還是 PHP 7.0~7.3,生成後會因型別宣告而報錯。建議:① 升級專案到 PHP 8.1+(推薦,效能和型別系統都更好);② 或生成後在 IDE 中批次移除型別宣告(Find & Replace `public int ` → `public `);③ 或使用 PHP 7.4 的相容模式(本工具預設 PHP 7.4 是底線)。

故障排查

提示「請輸入 JSON 資料」或右側為空

左側輸入框為空或只有空白字元。確保已貼上有效的 JSON 內容,或點擊「Sample」載入中文範例,或點擊「Upload」選擇 .json / .txt 檔案。

提示「Unexpected token ... in JSON at position N」

JSON 格式不合法。常見原因:① 末尾有多餘逗號(如 {"a":1,});② 用了單引號而非雙引號;③ JS 物件寫法(如 {key: value})而非 JSON(如 {"key": "value"})。點擊「修復 JSON」按鈕可自動修復部分錯誤。

生成的程式碼在 PHP 7.x 專案中報錯「Typed property must not be accessed before initialization」

本工具生成的類別預設使用 PHP 7.4+ 的 typed properties(如 public int $id)。如果你的專案還在 PHP 7.0~7.3,型別宣告會觸發相容性問題。解決方案:① 升級專案到 PHP 8.1+(推薦,效能與型別系統都更好);② 在 IDE 中批次移除型別宣告(Find & Replace `public int ` → `public `);③ 取消勾選「PHP 7.4 typed properties」選項(僅對部分程式碼風格生效)。

PHP 8.1 readonly class 報錯「Cannot modify readonly property」

readonly class 風格生成的屬性在建構期後不可修改。如果你嘗試 $user->name = 'Bob' 會報錯。解決方案:① 修改為 ArrayObject 或 stdClass 風格(屬性可修改);② 或重新 new User(...) 建立一個新實例代替修改。

Laravel 專案中找不到 Illuminate\Contracts\Support\Jsonable

Laravel 整合風格需要 laravel/framework 依賴。在 composer.json 中確保有:"require": { "php": "^8.1", "laravel/framework": "^11.0" }。然後執行 composer update 安裝依賴。如果不使用 Laravel,請改選 ArrayObject 或 stdClass 風格。

Symfony Serializer 反序列化失敗「Cannot denormalize object」

常見原因:① 生成的類別沒有 public 屬性或 getter 方法(Symfony Serializer 預設用 PropertyNormalizer);② 類別缺少無參建構器但有必填參數。解決方案:① 確認本工具已生成 public 屬性;② 使用 fromArray() 靜態方法手動建構物件後再傳給 Serializer。

巢狀物件的類別名不是我想要的(如 categories 被命名為 Categori)

工具對陣列中的物件採用「移除末尾 s + 首字母大寫」的命名規則,對於 categories 等不規則複數命名不友好。建議:① 把源 JSON 的 key 改為單數(如 categories → category);② 或生成後在 IDE 中用 IDE 的 Rename 重新命名類別(同時修改所有引用)。

下載的 ZIP 解壓後目錄結構不對

ZIP 內的目錄按 namespace 設定組織(預設 App/Models/)。如果解壓後位置不對,可:① 修改 namespace 名(如改為 App\Dto)重新下載;② 用 unzip -d src/ 指定解壓目錄;③ 或在 IDE 中直接 File → Open 整個解壓後的資料夾。

生成的類別沒有自動載入

Composer 專案需要在 composer.json 中配置 PSR-4 自動載入映射,例如:"autoload": { "psr-4": { "App\\": "src/" } }。然後執行 composer dump-autoload,Composer 會按 namespace 到目錄的映射自動載入類別檔案。

snake_case 轉 camelCase 後存取欄位名變化

「轉 camelCase」會改變 PHP 屬性名(如 user_name → userName),但 jsonSerialize() 方法的 return 陣列 key 仍為原 snake_case,json_encode() 輸出的 JSON 仍是原欄位名。所以存取 PHP 屬性用 $user->userName,輸出 JSON 仍是 {"user_name": "..."}。如果反序列化也希望按 camelCase 存取,需要在 jsonSerialize() 的 return 陣列中改為 camelCase key。

生成 100+ 個巢狀類別時頁面卡頓

工具無顯式類別數限制,但瀏覽器對超大 DOM 渲染效能下降明顯。建議:① 把 JSON 拆分成幾個獨立模組分別轉換;② 或直接在 IDE 中用 IDE 自帶的程式碼生成工具(如 PhpStorm 的 JSON to PHP 外掛);③ 巢狀層級建議不超過 6 層,否則建議重構 JSON 結構。

陣列是數字型別卻生成 array<int> 但實際是 array<float>

工具按陣列首個元素推斷型別(如 [1, 2, 3] 推斷為 int,[1.5, 2.5] 推斷為 float)。如果你混合了整數和浮點數(如 [1, 2.5]),工具會按首個元素推斷。解決:① 在源 JSON 中至少新增一個範例浮點元素(如 [0.0, 1.5]);② 或生成後手動調整 PHPDoc 註解中的型別。

null 值欄位生成為 ?mixed 類型而不是 ?string

JSON null 值會被工具預設推斷為 ?mixed 類型(因為無法判斷實際型別)。這是安全做法,避免誤判。如確知型別,可在源 JSON 中給該欄位一個範例值(如 "field": "" 推斷為 string),生成後把類型改為 ?string 即可。

composer dump-autoload 後類別仍未自動載入

可能原因:① namespace 與目錄不匹配(如 namespace App\Models 但檔案在 src/Dto/);② composer.json 的 psr-4 映射寫錯(如 "App\\": "src/Dto/" 應為 "App\\Dto\\": "src/Dto/")。解決:檢查每個 .php 檔案的 namespace 是否與目錄路徑嚴格對應(namespace 段必須等於目錄段,區分大小寫)。

PHPStan 提示「Property does not have default value」

生成的 typed properties 沒有預設值,PHPStan 在 --level=8 模式下認為可能未初始化。解決:① 關閉 PHPStan 的 strict rules;② 在建構器中用空值賦值(如 $this->tags = []);③ 用 readonly class 風格(建構器提升後即被賦值)。

Symfony Serializer 反序列化物件陣列失敗

對 [{...},{...}] 這種物件陣列,PropertyNormalizer 需要元素型別提示。解決:① 在 PHPDoc 中明確 array<User> 類型;② 或使用 ArrayCollection 包裝($users = new ArrayCollection())。

中文 key 生成的 PHP 屬性名帶特殊字元

源 JSON 中含中文 key(如 "姓名": "Alice")時,工具會生成 public string $姓名 屬性,IDE 可能提示命名不規範但不會報錯。建議:① 把 JSON key 改為英文(更符合 PHP PSR-1 命名規範);② 保留中文時確保 PHP 檔案編碼為 UTF-8(PHP 預設 UTF-8)。

ArrayObject 風格 $obj['key'] 與 $obj->key 輸出順序不一致

ArrayObject 風格的陣列存取按屬性宣告順序返回,物件存取按 jsonSerialize() 方法中的 return 陣列順序返回。如兩者順序不一致會導致 echo json_encode() 輸出與 var_dump($obj) 不一致。建議:保持 jsonSerialize() 的 return 順序與建構器參數順序一致。

WebHook 回呼 JSON 中數字 ID 超過 PHP_INT_MAX

PHP 的 int 在 64 位元系統上是 64 位元有符號整數(最大值 9223372036854775807),如果 JSON 中的數字 ID 超過此範圍(如 Twitter 雪花的 ID),會被截斷。解決:① 用字串類型接收 ID("id": "1234567890123456789");② 用 JSON_BIGINT_AS_STRING 標誌解析。

術語表

namespace
PHP 5.3+ 引入的命名空間機制,避免類別名衝突。本工具根據使用者設定的 namespace 自動生成,並在 ZIP 中按 App/Models/ 目錄組織。
class
PHP 中定義物件的範本。本工具生成的即為標準 PHP class,可直接 new User(...) 實例化。
ArrayObject
PHP SPL 標準庫中的類別,實作 ArrayAccess 等介面。本工具 ArrayObject 風格生成的類別即繼承自 \ArrayObject,支援陣列式與物件式雙重存取。
stdClass
PHP 內建的通用物件類別,json_decode($json, false) 預設返回此類型。本工具 stdClass 風格生成的類別即繼承自 \stdClass,僅支援物件式存取。
typed properties
PHP 7.4+ 引入的屬性型別宣告(如 public int $id)。本工具生成的屬性預設帶型別宣告,IDE 與靜態分析工具可直接做型別檢查。
readonly class
PHP 8.1+ 引入的唯讀類別,類別內所有屬性自動為 readonly,建構期後不可修改。本工具 readonly 風格生成 final readonly class,適合 DTO 不可變場景。
JsonSerializable
PHP 5.4+ 引入的介面,實作該介面的物件在被 json_encode() 時會自動呼叫 jsonSerialize() 方法。本工具所有類別都自動實作該介面。
Jsonable (Laravel)
Laravel 框架的契約介面,實作後物件可呼叫 toJson() 輸出 JSON。本工具 Laravel 整合風格會自動 implements 該介面。
Arrayable (Laravel)
Laravel 框架的契約介面,實作後物件可呼叫 toArray() 輸出陣列。本工具 Laravel 整合風格會自動 implements 該介面。
Composer
PHP 官方的依賴管理工具。使用本工具生成的程式碼時,需要在 composer.json 中配置 PSR-4 自動載入(如 App\\: src/)。
PSR-4
PHP-FIG 制定的自動載入規範,按命名空間到目錄的映射載入類別檔案。本工具生成的 ZIP 包按 namespace 路徑組織,符合 PSR-4 規範。
Symfony Serializer
Symfony 元件的序列化框架。本工具 ArrayObject 風格生成的類別可配合 Symfony Serializer 的 PropertyNormalizer 做深度序列化與反序列化。
Eloquent API Resource
Laravel Eloquent 的 API 資源類別,用於格式化 API 回應。本工具 Laravel 整合風格生成的類別可直接作為 API Resource 基類使用。
composer.json
Composer 專案的配置檔。本工具生成的程式碼放入 src 目錄後,需要在 composer.json 中配置 autoload 段並執行 composer dump-autoload。
json_encode / json_decode
PHP 內建的 JSON 序列化與反序列化函式。本工具生成的類別實作 JsonSerializable 後,json_encode() 會自動呼叫 jsonSerialize() 方法。
PHPUnit DataProvider
PHPUnit 測試框架的資料提供器機制。本工具生成的 PHP 類別可作為 DataProvider 注入測試案例,配合 IDE 自動補全提升測試編寫效率。
PHPStan
PHP 靜態分析工具,可對程式碼做型別檢查、錯誤偵測。本工具生成的類別因帶 typed properties,能被 PHPStan 在 --level=8 模式下完整推斷屬性類型。
Psalm
另一款 PHP 靜態分析工具,由 Vimeo 開源。本工具生成的類別配合 Psalm 的 PropertyTypeProvider 可做強型別校驗。
Doctrine
PHP 生態的 ORM 與 DBAL 工具集。本工具生成的 PHP 類別可作為 Doctrine Entity 的骨架,先手動新增 #[ORM\Column] 等註解。
php -l
PHP 命令列語法檢查指令。本工具生成的類別可先執行 php -l User.php 做語法驗證,再 require 進專案。
Composer dump-autoload
Composer 重新生成自動載入索引的命令。本工具生成的類別放入 src 目錄後,必須執行 composer dump-autoload 才能被 PSR-4 自動載入識別。
JSON_THROW_ON_ERROR
PHP 7.3+ 的 json_decode() 錯誤處理標誌,開啟後 JSON 解析失敗會丟擲 JsonException 異常。本工具 Laravel 範例使用了嚴格解析。
Hash (PHP)
PHP 內建的雜湊函式,常用於 WebHook 驗簽。本工具生成的 WebHook 回呼類別配合 hash_hmac() 做簽名校驗。

JSON 類型到 PHP 類型映射速查表

工具自動推斷的 JSON 資料型別與對應的 PHP 類型對照:

JSON 值範例判斷方法生成 PHP 類型屬性預設值
nullvalue === null?mixed / ?typenull
true / falsetypeof value === 'boolean'boolfalse
42typeof value === 'number' && Number.isInteger(value)int0
3.14typeof value === 'number' && !Number.isInteger(value)float0.0
"hello"typeof value === 'string'string''
[...] (空陣列)Array.isArray(value) && value.length === 0array (PHPDoc array<mixed>)[]
["a","b"]Array.isArray(value) && typeof value[0] === 'string'array (PHPDoc array<string>)[]
[1,2,3]Array.isArray(value) && typeof value[0] === 'number'array (PHPDoc array<int>)[]
[{...},{...}]Array.isArray(value) && typeof value[0] === 'object'array (PHPDoc array<Xxx>)[]
{...} (巢狀物件)typeof value === 'object' && !Array.isArray(value)Xxx (獨立類別)new Xxx()

PHP 4 種程式碼風格對比表

工具支援的 4 種 PHP 類別程式碼風格,根據專案需求選擇:

程式碼風格繼承 / 修飾實作介面適用場景
ArrayObject 風格extends \ArrayObjectimplements \JsonSerializableSymfony Serializer 生態、需要陣列式存取 $obj['key']、PHP 標準庫相容
stdClass 風格extends \stdClassimplements \JsonSerializableWordPress REST API、json_decode 預設行為相容、輕量物件資料載體
readonly class 風格final readonly class (無繼承)implements \JsonSerializablePHP 8.1+、API 回應 DTO、不可變資料傳輸物件、建構期後保證資料不被修改
Laravel 整合風格無繼承(預設)implements \Jsonable, \Arrayable, \JsonSerializableLaravel Eloquent API Resource、Eloquent 模型層、控制器回應格式化

Privacy & Security

本 JSON 轉 PHP 工具所有 JSON 解析、PHP 類別生成、ZIP 打包操作完全在你的瀏覽器本機透過 JavaScript(quicktype-core + JSZip)完成,輸入的 JSON 資料和生成的 PHP 程式碼都不會被上傳到任何伺服器,也不會被記錄、快取或儲存到雲端。包含內部介面欄位、未上線業務結構、未公開 API 回應的敏感 JSON 都可以放心使用,關閉頁面即清除全部資料。本工具不使用任何 Cookie 進行使用者追蹤,不收集郵箱或帳號資訊,不嵌入任何第三方統計指令碼,所有計算都在目前裝置的瀏覽器行程中完成。即使處於離線環境(如斷網或內網隔離環境),只要頁面已經載入過一次資源即可正常使用。

Authoritative References