dc/json

JSON序列化器

dev-master 2016-12-09 07:53 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:20:38 UTC


README

DC\JSON - Typed JSON

允许仅使用phpDoc和类型提示直接将序列化到类中。

安装

$ composer install dc/json

或者添加到composer.json

"require": {
	"dc/json": "0.*"
}
$ composer install

此包建议使用dc/iocdc/cache,但实际上这是一个非常强烈的推荐。没有它们使用将会痛苦或缓慢。

Build status

入门

获取一个新的\DC\JSON\Serializer并开始序列化

class Cat {
    /** @var string */
    public $name;
}
$json = '[{ "name": "Sniffles" }, { "name": "Snuggles" }]'; 
$serializer = new \DC\JSON\Serializer();
$cats = $serializer->deserialize($catsJson, '\Cat[]');

如果你使用的是dc/ioc容器,你需要这样做

\DC\JSON\IoC\SerializerSetup::setup($container);

序列化处理器

你可以注册一个序列化处理器来更改特定类的序列化方式。这与使用PHP中的JsonSerializable接口不同,因为序列化处理器允许你更改内置类的序列化和反序列化方式。

该接口本身易于实现。该库自带一个默认处理器,它将\DateTime对象序列化为ISO-8601格式。看看这个处理器是一个很好的例子。

如果你想注册自己的处理器,最简单的方式是使用IoC

$container->register('\MyHandler')->to('\DC\JSON\Handler')->withContainerLifetime();

类的构造方式

类是这样构造的

  1. 查找构造函数中的属性名。使用构造函数填写这些值。
  2. 查找形式为setX的公共setter来设置剩余值(这是由约定控制的,你可以覆盖它)。使用它们。
  3. 查找剩余值的公共属性。

所以,给定这个类

class Cat {
    private $name;
    private $age;
    public $paws = 4;

    function __construct($name) {
        $this->name = $name;
    }
    
    function setAge($age) {
        $this->age = $age;
    }
}

...和这个JSON

{
    "name": "Snuggles",
    "age": 6,
    "paws": 4
}

...这两个是等价的

$cat = $serializer->deserialize($json, '\Cat');
// or
$cat = new \Cat("Snuggles");
$cat->setAge(6);
$cat->paws = 4;

性能

其实json_decodejson_encode比这个包快得多。事实上,我们使用这些内部进行实际序列化。这个包的魔法在序列化和反序列化之前和之后应用。

通过类型提示和文档的组合,我们智能地构造你的对象,就像它们被期望的那样。但是,解析你的文档是资源密集型的,因此遵守一些规则是好的做法

  1. 尽量保持序列化实例在多次序列化中使用。所有的反射只会在第一次遇到类时发生。
  2. 安装dc/cachedc/cache-memcache,并将其提供给序列化器。如果这样做,所有从反射中获得的信息都会缓存一段时间。

当使用预热缓存时,反序列化比json_decode慢4-5倍。