vanilla / garden-jsont
一个简单的JSON转换库。
Requires (Dev)
- phpunit/phpunit: ^7
- vanilla/standards: ^1.3
- vimeo/psalm: ^3.4
This package is auto-updated.
Last update: 2024-09-19 13:37:51 UTC
README
这是一个根据JSON表示的规范转换数据的简单库。
目的
该包的目的是提供简单的数据转换,这些转换可以应用于来自JSON API的数据数组。转换在简单的数组中指定,因此整个转换规范也可以序列化为JSON,使其成为一个完全数据驱动的库。
转换器类
该库的核心是 Transformer
类,它在其构造函数中接受一个转换规范,然后使用该规范来告诉它如何转换数据。
$t = new Transformer($spec); $target = $t->transform($source);
Transformer
类也是可调用的,因此它可以作为需要回调的参数传递,例如 array_map
。
转换规范
转换规范是一个关联数组,包含目标数组的所有键,但值为源数组中键的JSON引用。
{ "targetKey1": "/sourceKey1", "targetKey2": "/sourceKey2/sourceKey2.1" }
从上面的内容中可以看出,您可以使用正斜杠分隔嵌套引用来引用嵌套值。
嵌套数据
对于复杂的目标数组,您可以通过像您期望的数据格式一样结构化目标来嵌套键。
{ "user": { "username": "/username", "fullName": "/fullName" } }
默认值
如果您引用的键在源数据中不存在,则它将在转换数据中省略。如果您想提供一个默认值,可以使用以下规范
{ "username": { "$ref": "/username", "$default": "anonymous" } }
如果您省略了 $default
值,则默认值假定为 null
。
使用 $each 转换数组
您可以使用 $each
和 $item
在数组中循环并对每个项目进行转换。
{ "$each": "/", "$item": { "name": "username", "id": "userID" } }
上面的转换将像这样的数组
[ { "username": "bot", "userID": 1 }, { "username": "dog", "userID": 2 } ]
转换为这个
[ { "name": "bot", "id": 1 }, { "name": "dog", "id": 2 } ]
您还可以使用 $key
属性指定数组中的键的转换。以下是一个示例规范
{ "$each": "/", "$item": "userID", "$key": "username" }
此规范将上面的示例转换为以下内容
{ "bot": 1, "dog": 2 }
绝对引用与相对引用
您可能已经注意到,大多数示例中的引用都是以 /
字符开头的。这是因为它们都是 绝对引用。
如果您在引用的开始处不使用 /
,则您指定了一个 相对引用。您在 $item
规范中使用相对引用来引用循环中的项。
字面值
有时您可能希望在结果中提供特定的字面值。您可以使用 $literal
键来做到这一点。
{ "version": { "$literal": "1.1" } }
为什么这个库不够用?
有些人认为这个库很脆弱,很愚蠢,不值得关心。但请不要相信它!该包的初始实现旨在提供最少的功能,以解决90%的问题。
随着需求的演变,将添加任何合理的功能。但是,它们必须遵守该包的核心目的:可以表示为纯JSON的转换。