php - 从 JSON 反序列化到 PHP,使用强制转换?

标签 php json serialization

假设我有一个具有“名称”和“密码”属性的用户类,以及一个“保存”方法。当通过 json_encode 将此类的对象序列化为 JSON 时,该方法被正确跳过,我最终得到类似 {'name': 'testName', 'password': 'testPassword'} 的内容。

但是,当通过 json_decode 反序列化时,我最终得到一个 StdClass 对象而不是 User 对象,这是有道理的,但这意味着该对象缺少“保存”方法。有什么方法可以将生成的对象转换为用户,或者向 json_decode 提供一些提示,说明我期望的对象类型?

最佳答案

老问题,但也许有人会觉得这很有用。
我创建了一个带有静态函数的抽象类,您可以在对象上继承这些函数,以便将任何 JSON 反序列化为继承类实例。

abstract class JsonDeserializer
{
    /**
     * @param string|array $json
     * @return $this
     */
    public static function Deserialize($json)
    {
        $className = get_called_class();
        $classInstance = new $className();
        if (is_string($json))
            $json = json_decode($json);

        foreach ($json as $key => $value) {
            if (!property_exists($classInstance, $key)) continue;

            $classInstance->{$key} = $value;
        }

        return $classInstance;
    }
    /**
     * @param string $json
     * @return $this[]
     */
    public static function DeserializeArray($json)
    {
        $json = json_decode($json);
        $items = [];
        foreach ($json as $item)
            $items[] = self::Deserialize($item);
        return $items;
    }
}

您可以通过在具有您的 JSON 将具有的值的类上继承它来使用它:

class MyObject extends JsonDeserializer
{
    /** @var string */
    public $property1;

    /** @var string */
    public $property2;

    /** @var string */
    public $property3;

    /** @var array */
    public $array1;
}

示例用法:

$objectInstance = new MyObject();
$objectInstance->property1 = 'Value 1';
$objectInstance->property2 = 'Value 2';
$objectInstance->property3 = 'Value 3';
$objectInstance->array1 = ['Key 1' => 'Value 1', 'Key 2' => 'Value 2'];

$jsonSerialized = json_encode($objectInstance);

$deserializedInstance = MyObject::Deserialize($jsonSerialized);

如果您的 JSON 包含目标对象的数组,您可以使用 ::DeserializeArray 方法。

Here是一个可运行的样本。

关于php - 从 JSON 反序列化到 PHP,使用强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/658469/

相关文章:

php - 如何编写代码以允许用户更改密码或更改用户名?

javascript - Tinymce - 仅显示基本设置?

javascript - 如何使用 jquery 将 xml 转换为 json

java - 从 PHP Web 服务解析 JSON 对象时出错

javascript - jQuery 序列化多个表单并以 JSON 形式发送

php - 带有 PHP 扩展的 CSS 缩小

json - 我该如何处理 Dart throw 问题?

c# - 如何通过 WCF Web 服务序列化并发送 MailMessage?

python - 用棉花糖序列化日期时间的简短方法

php - 将参数绑定(bind)到 pdo 函数