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": "alice@example.com",
    "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