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的转换。