widi / json-encode
一个轻量级深度json编码器,避免递归编码。
4.0.1
2021-11-25 17:40 UTC
Requires
- ext-json: *
- doctrine/collections: ^1
- psr/container: ^1
Requires (Dev)
- phpunit/phpunit: ^6 | ^7 | ^8
README
一个轻量级深度json编码器,避免递归编码。
变更日志
3.0.0
+ add generator support
编码器
使用编码器的方式如下
public function encode($value): string; // => json string
编码器工厂
编码器工厂将所有功能集成在一起。您可以提供一个依赖容器来从中获取策略。它接受实现 "psr/container" 接口的容器。实例映射将允许查找映射类的子类。例如,如果您扩展了 DateTime,如果没有启用实例映射,映射器将不会识别它。默认情况下,它是启用的。您可以禁用它以提高序列化的速度。
$encoder = $encoderFactory->create(
new GetIsHasMethodFilter(),
new ArrayCache(true, false),
new DefaultStrategy(false),
[
DateTime::class => [
'class' => DateTimeStrategy::class,
'options' => [
'format' => 'd.m.Y'
]
],
Collection::class => [
'class' => DoctrineCollectionStrategy::class
]
],
true,
$dependencyContainer
);
过滤器
过滤器确定哪些方法重要,可以从中获取信息。您可以使用 MethodFilterInterface 编写自己的过滤器。包括一个过滤器,用于调用对象的任何 is*、get*、has* 方法。提供了两个过滤器
- GetIsHasMethodFilter
- GetIsHasMethodSnakeCaseFilter 并且您可以通过使用过滤器接口轻松定义自己的过滤器。
缓存
缓存将保留有关过滤方法的信息,以及可选的属性名称。该包包括一个数组缓存和一个类似 null 缓存的 no-cache 缓存。您可以使用 CacheInterface 编写自己的缓存。
策略
有一个默认策略和一个处理 datetime 对象的策略。如果需要,您还可以添加自己的策略。通过类名和可选的实例映射,可以找到定义的策略。可以通过编码器工厂的第五个参数禁用实例映射。
用法
<?php
namespace Widi\JsonEncode;
require_once '../vendor/autoload.php';
use Widi\JsonEncode\Cache\ArrayCache;
use Widi\JsonEncode\Filter\GetIsHasMethodFilter;
$encoderFactory = new JsonEncoderFactory();
$encoder = $encoderFactory->create(
new GetIsHasMethodFilter(),
new ArrayCache(true, false),
new DefaultStrategy(false),
[
DateTime::class => [
'class' => DateTimeStrategy::class,
'options' => [
'format' => 'd.m.Y'
]
],
Collection::class => [
'class' => DoctrineCollectionStrategy::class
]
],
true
);
$provider = new Provider('providerName');
$tariffVersion = new TariffVersion('tariffVersionName');
$tariff = new Tariff(
'tariffName',
$provider,
$tariffVersion
);
$provider->setTariffVersion($tariffVersion);
$tariffVersion->setProvider($provider);
echo $encoder->encode($tariff) . PHP_EOL;