matthiasnoback/naive-serializer

一个简单的JSON序列化器,它递归地将对象图转换为JSON,并将其反过来,无需任何配置或自定义代码。

v0.11.1 2021-01-29 11:14 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库,该库处理所有与属性类型解析相关的工作。