jeely/lazyjsonmapper
PHP的高级、智能和自动面向对象的JSON容器。
Requires
- php: >=7.4
- corneltek/getoptionkit: 2.*
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.7.1
- phpunit/phpunit: ^9.5
README
PHP的高级、智能和自动面向对象的JSON容器。
实现了一个高效、自动、面向对象且轻量级的(内存使用)JSON数据容器。它提供了智能数据转换和解析,为您提供了简洁、可靠的接口,无需担心进行任何繁琐的解析。
特点
-
为您提供完全面向对象的JSON数据接口。
-
自动将复杂、嵌套的JSON数据结构映射到真实的PHP对象上,完全支持嵌套对象和多级数组。
-
针对高性能和低内存使用进行了极优化。比以前人们使用的其他PHP JSON映射器低得多。
例如,通常的PHP对象通过手动定义
$properties
,这是其他JSON映射器使用的,即使该属性不在JSON数据中(是NULL
),也会为每个属性消耗内存。我们的系统另一方面,对于当前对象JSON数据中不存在的任何属性,将占用零个字节的RAM! -
自动提供“直接虚拟属性”,让您可以像使用常规对象属性一样与JSON数据交互,例如
echo $item->some_value
和$item->some_value = 'foo'
。可以通过选项禁用虚拟属性。
-
自动提供面向对象的“虚拟函数”,让您可以通过如
$item->getSomeValue()
和$item->setSomeValue('foo')
等函数以完全面向对象的方式与数据交互。我们支持大量不同的函数来操作JSON数据,您可以通过简单地运行$item->printPropertyDescriptions()
来查看所有属性的可用函数名列表。可以通过选项禁用虚拟函数。
-
包含
LazyDoctor
工具,该工具自动记录所有基于LazyJsonMapper
的类,使它们的虚拟属性和函数对IDE和各种智能代码分析工具完全可见。它还通过编译所有类属性映射进行类诊断,这意味着如果此工具运行成功,您可以100%确信所有映射都是有效的(可编译的)。 -
我们提供了一个完整的内部API,您的子类可以使用它来与JSON容器内部的数据交互。这允许您轻松覆盖自动函数或为对象创建额外的函数。要覆盖核心函数,只需在对象上定义一个具有完全相同名称的函数,并让它执行您想要的任何操作。
以下是函数覆盖的一些示例
public function getFoo() { // try to read property, and handle a special "current_time" value. $value = $this->_getProperty('foo'); if ($value === 'current_time') { return time(); } return $value; } public function setFoo( $value) { // if they try to set value to "md5", we use a special value instead if ($value === 'md5') { $value = md5(time()); } return $this->_setProperty('foo', $value); }
-
所有映射/数据转换都是“懒加载”的,基于每个属性的。当您访问一个属性时,该特定属性将映射/转换为根据您的类属性映射定义的正确类型。不会浪费任何时间或内存来转换您从未接触过的属性。
-
强类型系统。类属性映射控制确切的类型和数组深度。您可以完全相信您获取/设置的数据将匹配您的规格。与规格不匹配的无效数据是不可能的。
-
高级设置系统。一切都可以通过PHP类常量轻松配置,这意味着您的类设置是无状态的(不需要任何特殊的“设置/映射器对象”来跟踪设置),并且所有设置都是不可变的常量(这意味着它们是可靠的,永远不会在运行时更改,因此您可以完全信任类将始终按照其代码中定义的方式行为)。
如果您想要为所有类以相同方式覆盖多个核心设置,那么只需创建一个
LazyJsonMapper
的子类,并在该子类上配置所有设置,然后从重新配置的子类派生所有其他类! -
世界上最先进的映射定义系统。您的类属性映射以易于理解的 PHPdoc 风格定义,支持多级数组(例如
int[][]
表示“整数数组的数组”),相对类型(因此您可以映射属性到类/对象,这些类/对象相对于类属性映射的命名空间),父类继承(所有父extends
层次的映射都将包含在最终的属性映射中)和多重继承(您可以将无限多的其他映射导入到类中,而这些映射并不来自您自己的父extends
层次)。 -
由于属性映射编译器非常高效,从父类继承属性或从其他类导入属性是一种零成本的操作。因此,请随时导入所需的所有内容。您甚至可以使用此系统创建可导入的类,这些类仅包含“共享属性集合”,并将它们导入到其他类中。
-
类属性映射在运行时为每个类编译一次,即首次使用类时。编译过程完全验证并编译所有属性定义、所有父映射、所有继承映射以及您链接属性的任何类的所有映射。
如果由于映射编写不当导致层次结构中任何地方的编译问题,您将详细显示确切的问题。
在成功的情况下,编译和验证的映射都存储在一个极富内存效率的格式中,存储在全局缓存中,该缓存与您的整个 PHP 运行时共享,这意味着在您的代码或任何其他库中访问相同类的内容都将共享这些类的缓存编译,以实现最大的内存效率。
-
您还可以访问在类属性映射中未定义的 JSON 属性。在这种情况下,它们被视为未定义和未类型化(
mixed
),并且不会对这些属性进行任何自动类型转换,但在紧急情况下仍然很有用。 -
为您的对象的 JSON 数据提供了许多数据导出/输出选项,以将其从对象中再次提取出来:作为一个多级数组、作为嵌套的 stdClass 对象,或者作为对象的 JSON 字符串表示。
-
我们包括一系列非常先进的调试功能。
您可以使用
$requireAnalysis
运行构造函数,以确保所有 JSON 数据都根据您的类属性映射成功映射,并且您没有遗漏数据中存在的任何属性。在任何问题的情况下,分析消息将给出您整个 JSON 数据层次结构中遇到的所有问题的完整列表。对于类属性映射本身,您可以使用如
printPropertyDescriptions()
的函数来查看所有属性及其定义的完整列表。这有助于调试类继承和导入,直观地查看最终类映射的外观,并帮助用户查看所有可用的属性及其所有虚拟函数。对于 JSON 数据,您可以使用如
printJson()
的函数来获取所有内部 JSON 数据的美丽视图,这在您(或您的用户)需要了解当前对象实例的数据存储内部有什么时非常有帮助。 -
一个细粒度和逻辑异常系统,确保您可以始终信赖对象的行为,并且可以轻松捕获问题。并且我们所抛出的所有内容始终基于
LazyJsonMapperException
,这意味着您可以在不关心细粒度区分的情况下简单地捕获该单个“根”异常。 -
干净的模块化代码确保了稳定性和未来的可扩展性。
-
深入代码文档解释了你可能想知道的一切。
-
最后,我们实现了超级高效的对象序列化。所有内容都以紧凑的格式存储,当你在运行时之间传输对象时,可以最小化数据大小。
安装
您需要至少 PHP 7.0 或更高版本。PHP 8 也完全支持并推荐使用。
运行以下 Composer 安装命令
composer require jeely/lazyjsonmapper
示例
查看 examples/
文件夹的内容。
文档
本库的源代码中直接对一切进行了完整文档。
您还可以在线阅读相同文档,格式为精美的 HTML 页面。
LazyDoctor
我们的自动类文档和诊断工具将放置在您的项目 ./vendor/bin/
文件夹中。只需不带任何参数运行它,即可查看所有可用选项的列表。您还可以在常规文本编辑器中打开该文件,阅读工具源代码顶部的通用使用技巧和窍门。
版权
版权所有 2022 LazyJsonMapper 项目
许可
作者
SteveJobzniak
贡献
如果您想为这个项目做出贡献,请随时提交拉取请求,或者甚至可以向团队成员发送捐赠,作为您感激的象征。