vanilla/garden-jsont

一个简单的JSON转换库。

v1.2 2020-02-23 00:24 UTC

README

Packagist Version MIT License CI CLA

这是一个根据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的转换。