You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中json_encode如何保留可空属性并输出null值?

解决方案

可以实现,以下是几种可行的操作方式:

方法1:显式初始化可空属性为null

修改User类的定义,给Email属性显式赋值null,让属性处于已定义状态,序列化时就会被包含进JSON:

class User {
    public string $Name = "John";
    public ?string $Email = null; // 显式初始化null
}

$user = new User();
echo json_encode($user, JSON_PRETTY_PRINT);

执行后会输出包含"Email": null的目标JSON。

方法2:实现JsonSerializable接口自定义序列化逻辑

通过实现PHP的JsonSerializable接口,手动控制序列化输出的字段和值,确保即使属性未初始化也能输出null:

class User implements JsonSerializable {
    public string $Name = "John";
    public ?string $Email;

    public function jsonSerialize(): mixed {
        return [
            'Name' => $this->Name,
            'Email' => $this->Email ?? null // 强制兜底为null
        ];
    }
}

$user = new User();
echo json_encode($user, JSON_PRETTY_PRINT);

这种方式适合需要灵活控制序列化内容的场景,不受属性是否初始化的限制。

方法3:实例化后手动赋值null

如果不想修改类的定义,可以在创建User实例后,给Email属性手动赋值null,再执行序列化:

class User {
    public string $Name = "John";
    public ?string $Email;
}

$user = new User();
$user->Email = null; // 手动赋值null
echo json_encode($user, JSON_PRETTY_PRINT);

原理说明

PHP的json_encode默认会忽略未初始化的类属性——即使属性声明了可空类型,只要没有被赋值过(包括赋值null),就不会被纳入序列化结果。只有当属性处于已定义状态(有明确赋值),或者通过自定义序列化逻辑强制指定,才会在JSON中输出对应的字段和值。

内容的提问来源于stack exchange,提问作者Actimele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:57:05