matthiasnoback / naive-serializer
一个简单的JSON序列化器,它递归地将对象图转换为JSON,并将其反过来,无需任何配置或自定义代码。
v0.11.1
2021-01-29 11:14 UTC
Requires
- php: ^7.4|^8.0
- ext-json: *
- beberlei/assert: ^3.2
- phpdocumentor/reflection-docblock: ^5.2
Requires (Dev)
- phpstan/phpstan: ^0.12.42
- phpstan/phpstan-beberlei-assert: ^0.12.3
- phpstan/phpstan-phpunit: ^0.12.16
- phpunit/phpunit: ^9.3
This package is auto-updated.
Last update: 2024-08-29 04:25:34 UTC
README
本库提供的JsonSerializer是一个非常简单的序列化/反序列化器,它递归地将对象图转换为JSON,并将其反过来,无需任何配置或自定义代码。其设计目标是
- 用户不应被迫向现有类添加自定义配置。
- 用户不应需要编写任何支持代码。
- 解决方案应尽可能处理尽可能少的边缘情况。
- 解决方案应尽可能小,而不会变得无用(<=100 LOC)。
- 解决方案应通过描述性的异常警告用户其限制。
为了使此功能正常工作,此库限制了您只能使用以下类型的值
null
- 标量(int,float,bool)
- 用户定义的对象(因此不能使用内置的PHP类,如
\DateTimeImmutable
) - 所有值都是同一类型的数组(映射或列表)
- 以及以上类型的任何组合
此外,您需要在标准的@var
文档块注释中定义您使用的类型(您可能已经这样做),例如
/** * @var string * * @var int * * @var bool * * You can use a relative class name: * * @var ClassName * * Or a full class name: * * @var Fully\Qualified\Class\Name */
当然,每个属性都应该只有一个@var
注释。
对于简单类型,您也可以使用PHP原生的属性类型
private string $string; private int $int; private bool $bool; private ClassName $object;
具有array
类型的属性仍然需要额外的@var
注释。您可以通过在@var
注释中添加[]
来定义上述类型的列表,例如
/** * @var Fully\Qualified\Class\Name[] */ private array $array;
为了解决不能使用PHP内置类的限制,只需将数据在内部转换为其他类型。例如,要使用\DateTimeImmutable
时间戳
/** * @var string */ private $timestamp; public function __construct(\DateTimeImmutable $timestamp) { $this->timestamp = $timestamp->format(\DateTime::ISO8601); } public function getTimestamp() : \DateTimeImmutable { return \DateTimeImmutable::createFromFormat(\DateTime::ISO8601, $this->timestamp); }
要使用序列化器
// create an object $object = ...; $serializedData = Serializer::serialize($object); // $serializedData will be a pretty-printed JSON string
要反序列化数据
$restoredObject = Serializer::deserialize( Fully\Qualified\Class\Name::class, $serializedData ); // $restoredObject will be of type Fully\Qualified\Class\Name
您可以通过在文档块中添加@ignore
来强制(反)序列化器忽略某些属性
final class IgnoredProperty { /** * @var array<object> * @ignore */ public $events = []; /** * @var string */ public $foo; }
如果您愿意,可以创建一个JsonSerializer
实例并调用其对象方法,而不是调用Serializer
的静态方法。
感谢
此库依赖于phpdocumentor/reflection-docblock
库,该库处理所有与属性类型解析相关的工作。