tarikweiss / tjson
将 json 字符串映射到对象及其反向操作
v0.3.0
2024-06-06 21:00 UTC
Requires
- php: >=7.4
- ext-json: *
- doctrine/annotations: ^1.13
Requires (Dev)
- phpstan/phpstan: ^1.11
- phpunit/phpunit: ^9.5
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
作为对象/类中的属性名称。但它也可以包含完全不同的名称。如果定义的名称出现多次,则抛出异常。例如,您有两个属性,在您的类中称为 foo
和 bar
,并且您使用此注释和值 bar
注释 foo
,那么您已多次定义名称 bar
,这将导致异常。
Omit
此注释明确禁用双向属性映射,这意味着如果属性存在于 json 中,则在解码时将被忽略;如果存在编码,则不会包含在 json 中。
注意 此注释覆盖此注释的重复检查,因为它不适用于映射。
Required
此属性用于定义某些内容为必需的。这特别用于无类型属性,意味着有类型属性默认始终是必需的。
注意 您可以使用此注释禁用属性的需求状态,即使它是类型化的也是如此,但这意味着属性保持未初始化状态,可能导致非法访问(例如使用获取器)。