widi/json-encode

一个轻量级深度json编码器,避免递归编码。

4.0.1 2021-11-25 17:40 UTC

This package is auto-updated.

Last update: 2024-09-25 12:22:40 UTC


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;