dc / json
JSON序列化器
dev-master
2016-12-09 07:53 UTC
Requires
- php: >=5.6.0
- phpdocumentor/reflection-docblock: 2.*
Requires (Dev)
- dc/cache: dev-master
- dc/ioc: dev-master
- phpunit/phpunit: 4.0.*
This package is not auto-updated.
Last update: 2024-09-14 18:20:38 UTC
README
允许仅使用phpDoc和类型提示直接将序列化到类中。
安装
$ composer install dc/json
或者添加到composer.json
"require": { "dc/json": "0.*" }
$ composer install
此包建议使用dc/ioc
和dc/cache
,但实际上这是一个非常强烈的推荐。没有它们使用将会痛苦或缓慢。
入门
获取一个新的\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();
类的构造方式
类是这样构造的
- 查找构造函数中的属性名。使用构造函数填写这些值。
- 查找形式为
setX
的公共setter来设置剩余值(这是由约定控制的,你可以覆盖它)。使用它们。 - 查找剩余值的公共属性。
所以,给定这个类
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_decode
和json_encode
比这个包快得多。事实上,我们使用这些内部进行实际序列化。这个包的魔法在序列化和反序列化之前和之后应用。
通过类型提示和文档的组合,我们智能地构造你的对象,就像它们被期望的那样。但是,解析你的文档是资源密集型的,因此遵守一些规则是好的做法
- 尽量保持序列化实例在多次序列化中使用。所有的反射只会在第一次遇到类时发生。
- 安装
dc/cache
和dc/cache-memcache
,并将其提供给序列化器。如果这样做,所有从反射中获得的信息都会缓存一段时间。
当使用预热缓存时,反序列化比json_decode
慢4-5倍。