tarikweiss/tjson

将 json 字符串映射到对象及其反向操作

v0.3.0 2024-06-06 21:00 UTC

This package is auto-updated.

Last update: 2024-09-06 21:25:49 UTC


README

将 json 字符串映射到对象及其反向操作。

用法

此库包含将对象映射到 json 字符串及其反向操作的编码器和解码器。它会映射所有属性(包括私有和受保护的),只要它们没有被标记为不进行转换。

示例对象类

可以使用 doctrine 注释或新的 PHP 8 属性来配置属性。以下是关于注释/属性的完整文档。

class ClassToConvert
{
    #[\Tjson\Attributes\MappedPropertyName(name: 'public_item')]
    public $publicItem;
    
    protected $protectedItem;
    
    private $privateItem;
    
    #[\Tjson\Attributes\MappedPropertyClass(class: ClassC::class)]
    private ClassA|ClassB|ClassC $typedItems;
    
    /**
     * @\Tjson\Attributes\Required(required = true)
     */
    private $anotherProperty = 'withValue';
    
    // Class getters and setters
}

基本用法

JSON

以下示例中的 json 假设为 $jsonString 的值

{
  "public_item": "Value of public item",
  "protectedItem": 1337,
  "privateItem": null,
  "typedItems": {
    "property1": "foo",
    "property2": "bar"
  },
  "anotherProperty": "anotherValue"
}

解码器

解码操作如下

$jsonDecoder = new \Tjson\JsonDecoder();

$yourClassInstance = $jsonDecoder->decodeByClassName($jsonString, \Your\Class::class)
echo $yourClassInstance->getProtectedItem() // 1337

编码器

编码操作如下

$jsonEncoder = new \Tjson\JsonEncoder();

$jsonString = $jsonEncoder->encode($yourClassInstance);

属性/注释

可以使用属性/注释来控制编码或解码的行为。属性在层次结构上始终高于 doctrine 注释。这意味着,如果您既作为注释又作为属性定义了某些内容,那么属性将获胜。

MappedPropertyClass

此注释用于在解码时设置特定的类。如果给出,它需要匹配类型,否则会抛出异常。

MappedPropertyName

此注释用于更改编码/解码时属性的名称。例如,您可以使用 foo_bar 作为 json 属性名称,但使用 fooBar 作为对象/类中的属性名称。但它也可以包含完全不同的名称。如果定义的名称出现多次,则抛出异常。例如,您有两个属性,在您的类中称为 foobar,并且您使用此注释和值 bar 注释 foo,那么您已多次定义名称 bar,这将导致异常。

Omit

此注释明确禁用双向属性映射,这意味着如果属性存在于 json 中,则在解码时将被忽略;如果存在编码,则不会包含在 json 中。
注意 此注释覆盖此注释的重复检查,因为它不适用于映射。

Required

此属性用于定义某些内容为必需的。这特别用于无类型属性,意味着有类型属性默认始终是必需的。
注意 您可以使用此注释禁用属性的需求状态,即使它是类型化的也是如此,但这意味着属性保持未初始化状态,可能导致非法访问(例如使用获取器)。