json是什么 深入理解json的本质和用途

2025-01-0107:25:55常识分享0

为了更便捷地演示,我们先来创建一个名为 `user` 的数据表,其中 `info` 字段将用于存储用户的基础信息,并且我们将 `info` 字段定义为 JSON 类型的数据。定义方式很简单,只需在字段名后接上 `JSON` 即可。

表创建成功后,我们将按照常见的 CRUD 数据操作来讲解如何对 JSON 数据类型进行操作。

在添加数据时,虽然 MySQL 本质上将 JSON 存储为字符串操作,但当定义为 JSON 类型后,内部会为数据创建一些索引以方便后续操作。添加 JSON 数据时需要使用字符串包装。除了手动拼接 JSON 外,还可以利用 MySQL 提供的 JSON 创建函数。

例如:

- `JSON_OECT`:用于快速创建 JSON 对象,奇数列为 key,偶数列为 value,使用方法如 `JSON_OECT('key', 'value', 'key1', 'value1')`。

- `JSON_ARRAY`:用于快速创建 JSON 数组,使用方法如 `JSON_ARRAY('item0', 'item1', 'item2')`。

对于 JavaScript 工程师来说,虽然使用字符串写或使用自带函数创建 JSON 都较为麻烦,但不如 JS 原生对象使用起来便捷。在 think-model 模块中,我们增加了对 JSON 数据类型的支持,直接传入 JS 对象数据即可,无需再进行额外的字符串处理。为了开启这项功能,需要在模块中配置 `jsonFormat: true`。

接下来,让我们看看存入数据库中的数据样子。为了更好地支持 JSON 数据的操作,MySQL 提供了一系列 JSON 数据操作方法。例如:

- `JSON_EXTRACT()`:用于根据 Path 获取部分 JSON 数据。

- `->` 和 `->>`:分别是 `JSON_EXTRACT()` 的等价写法以及与 `JSON_UNQUOTE()` 的结合写法,用于获取并去除 JSON 字符串中的引号。

- 其他如 `JSON_KEYS()`、`JSON_SEARCH()` 等方法,都提供了对 JSON 数据的不同操作。

我们不再对每个方法进行详细举例描述,而是提出一些场景下的操作方式。例如,想要获取 JSON 数据中的部分内容并以正常表字段形式返回时,可以使用 `JSON_EXTRACT` 或等价的 `->`、`->>` 操作。对于 Path 的写法,MySQL 通过字符串 Path 描述来映射对应数据,与 JavaScript 中对象的操作类似。

在使用 think-model 进行相关操作时,对应的写结合 EXP 条件表达式来完成。例如,对于 `JSON_ARRAY_APPEND` 方法,它在给数组添加值时比 `JSON_INSERT` 等方法更为便捷,无需知道数组的具体长度。

需要注意的是,由于 JSON_SEARCH 不做类型转换,匹配出的路径字符串需要进行 `JSON_UNQUOTE()` 操作。JSON_SEARCH 目前无法对数值类型数据进行查找,这也是使用时需注意的点。

对于近期的一个需求——记录一堆数据的排序情况并方便输出——我们可以考虑使用 JSON 字段存储排序数组的方式来解决。这样不仅满足了需求,还让我们对 MySQL 的 JSON 支持有了更深入的了解,同时对 think-model 进行了一些优化以支持 JSON 数据类型。

总体来看,配合 MySQL 提供的 JSON 操作函数,对于日常的一些需求是可以满足的。虽然与 MongoDB 这种天生支持 JSON 的数据库相比在操作性上可能稍显麻烦,但在类型转换和路径查找等方面都有其独特之处。只要熟悉了这些特性并合理使用,MySQL 同样能够高效地处理 JSON 数据。