MySQL8.0 JSON函数之创建与返回JSON属性(四)
经过前面三篇的文章的介绍,相信大家已经对MySQL JSON数据类型有了一定的了解,为了在业务中更好的使用JSON类型,今天我们来具体介绍一下JSON函数的使用;
根据JSON函数的作用,我们将JSON函数划分为如下几个类别:
(1)创建JSON值的函数 (2)返回JSON值属性的函数 (3)搜索JSON值的函数 (4)修改JSON值的函数 (5)JSON表功能函数
本文我们将介绍创建和返回JSON值属性的相关函数的使用方法;
一、创建JSON值的函数
JSON_ARRAY([val[, val] …])
计算值列表(可能为空),并返回包含这些值的JSON数组。
mysql> SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());
+---------------------------------------------+
| JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME()) |
+---------------------------------------------+
| [1, "abc", null, true, "14:11:17.000000"] |
+---------------------------------------------+
1 row in set (0.00 sec)
JSON_OBJECT([key, val[, key, val] …])
计算键值对的列表(可能为空),并返回包含这些键值对的JSON对象。如果任何键名为NULL或参数个数为奇数,则会发生错误。
mysql>SELECT JSON_OBJECT('id', 87, 'name', 'carrot');
+-----------------------------------------+
| JSON_OBJECT('id', 87, 'name', 'carrot') |
+-----------------------------------------+
| {"id": 87, "name": "carrot"} |
+-----------------------------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_OBJECT('id', 87, '', 'carrot');
+-------------------------------------+
| JSON_OBJECT('id', 87, '', 'carrot') |
+-------------------------------------+
| {"": "carrot", "id": 87} |
+-------------------------------------+
1 row in set (0.00 sec)
mysql >SELECT JSON_OBJECT('id', 87, 'carrot');
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_OBJECT'
mysql>SELECT JSON_OBJECT('id', 87, null, 'carrot');
ERROR 3158 (22032): JSON documents may not contain NULL member names.
JSON_QUOTE(string)
通过使用双引号字符和转义内部引号以及其他字符将字符串括起来作为JSON值引用,然后将结果作为utf8mb4字符串返回。如果参数为NULL,则返回NULL。
此函数通常用于生成有效的JSON字符串文字,以包含在JSON文档中。
mysql>SELECT JSON_QUOTE('[1, 2, 3]');
+-------------------------+
| JSON_QUOTE('[1, 2, 3]') |
+-------------------------+
| "[1, 2, 3]" |
+-------------------------+
1 row in set (0.00 sec)
二、返回JSON值属性函数
JSON_DEPTH(json_doc)
返回 JSON 文档的最大深度。如果参数为 NULL,则 返回 NULL。如果参数不是有效的 JSON 文档,则会发生错误。
空数组、空对象或标量值的深度为1。仅包含深度为1的元素的非空数组或仅包含深度为1的成员值的非空对象的深度为2。否则,JSON文档的深度大于2。
mysql>SELECT JSON_DEPTH('{}'), JSON_DEPTH('[]'), JSON_DEPTH('true');
+------------------+------------------+--------------------+
| JSON_DEPTH('{}') | JSON_DEPTH('[]') | JSON_DEPTH('true') |
+------------------+------------------+--------------------+
| 1 | 1 | 1 |
+------------------+------------------+--------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_DEPTH('[10, 20]'), JSON_DEPTH('[[], {}]');
+------------------------+------------------------+
| JSON_DEPTH('[10, 20]') | JSON_DEPTH('[[], {}]') |
+------------------------+------------------------+
| 2 | 2 |
+------------------------+------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_DEPTH('[10, {"a": 20}]');
+-------------------------------+
| JSON_DEPTH('[10, {"a": 20}]') |
+-------------------------------+
| 3 |
+-------------------------------+
1 row in set (0.00 sec)
JSON_LENGTH(json_doc[, path])
返回 JSON 文档的长度,或者,如果path给出了参数,则返回 由路径标识的文档中值的长度。如果任何参数为NULL或路径参数未在文档中标识值,则返回NULL。如果json_doc参数不是有效的 JSON 文档或 path参数不是有效的路径表达式或包含通配符*或 **通配符,则会发生错误。
mysql> SELECT JSON_LENGTH('[1, 2, {"a": 3}]');
+---------------------------------+
| JSON_LENGTH('[1, 2, {"a": 3}]') |
+---------------------------------+
| 3 |
+---------------------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}');
+-----------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}') |
+-----------------------------------------+
| 2 |
+-----------------------------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b');
+------------------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b') |
+------------------------------------------------+
| 1 |
+------------------------------------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.c');
+------------------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.c') |
+------------------------------------------------+
| NULL |
+------------------------------------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.d');
+------------------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.d') |
+------------------------------------------------+
| NULL |
+------------------------------------------------+
1 row in set (0.00 sec)
文档的长度确定如下:
- 标量的长度为 1。
- 数组的长度是数组元素的数量。
- 对象的长度是对象成员的数量。
- 长度不计算嵌套数组或对象的长度。
JSON_TYPE(json_val)
返回utf8mb4指示JSON值类型的字符串。这可以是对象、数组或标量类型,如下所示:
mysql>SELECT JSON_TYPE(@j);
+---------------+
| JSON_TYPE(@j) |
+---------------+
| OBJECT |
+---------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a'));
+------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a')) |
+------------------------------------+
| ARRAY |
+------------------------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]'));
+---------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]')) |
+---------------------------------------+
| INTEGER |
+---------------------------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]'));
+---------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]')) |
+---------------------------------------+
| BOOLEAN |
+---------------------------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[2]'));
+---------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a[2]')) |
+---------------------------------------+
| NULL |
+---------------------------------------+
1 row in set (0.00 sec)
如果参数为 NULL,JSON_TYPE()返回 NULL:
mysql>SELECT JSON_TYPE(NULL);
+-----------------+
| JSON_TYPE(NULL) |
+-----------------+
| NULL |
+-----------------+
1 row in set (0.00 sec)
如果参数不是有效的 JSON 值,则会发生错误:
mysql dba_admin@127.0.0.1:(none)14:18:07> SELECT JSON_TYPE(1);
ERROR 3146 (22032): Invalid data type for JSON data in argument 1 to function json_type; a JSON string or JSON type is required.
对于非NULL、非错误结果,以下列表描述了可能的 JSON_TYPE()返回值:
* 纯JSON类型: *OBJECT: JSON 对象 *ARRAY: JSON 数组 *BOOLEAN:JSON 真假文字 *NULL:JSON 空字面量 *数字类型: *INTEGER: MySQL TINYINT, SMALLINT, MEDIUMINTand INT和 BIGINT标量 *DOUBLE: MySQL 标量 DOUBLE FLOAT *DECIMAL: MySQL DECIMAL和 NUMERIC标量 *时间类型: *DATETIME: MySQL DATETIME和 TIMESTAMP标量 *DATE: MySQL DATE标量 *TIME: MySQL TIME标量 *字符串类型: *STRING: MySQL utf8字符类型标量: CHAR, VARCHAR, TEXT, ENUM, and SET *二进制类型: *BLOB:MySQL二进制标量类型包括BINARY, VARBINARY, BLOB,和 BIT *所有其他类型: *OPAQUE (原始位)
JSON_VALID(val)
返回0或1以指示值是否为有效的JSON。如果参数为NULL,则返回NULL。
mysql>SELECT JSON_VALID('{"a": 1}');
+------------------------+
| JSON_VALID('{"a": 1}') |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_VALID('hello'), JSON_VALID('"hello"');
+---------------------+-----------------------+
| JSON_VALID('hello') | JSON_VALID('"hello"') |
+---------------------+-----------------------+
| 0 | 1 |
+---------------------+-----------------------+
1 row in set (0.00 sec)
mysql>SELECT JSON_VALID(NULL), JSON_VALID('"hello"');
+------------------+-----------------------+
| JSON_VALID(NULL) | JSON_VALID('"hello"') |
+------------------+-----------------------+