is_json_scalar(json) → boolean

判断 json 是否为标量(即 JSON 数字、JSON 字符串、truefalsenull)。

示例 1

1
SELECT is_json_scalar(JSON '"aaa"');
1
2
3
4
 _col0
-------
true
(1 row)

示例 2

1
SELECT is_json_scalar(JSON '{"x": 1, "y": 2}');
1
2
3
4
 _col0
-------
false
(1 row)

json_array_contains(json, value) → boolean

判断 value 是否存在于 json(一个包含 JSON 数组的字符串)中。

示例 1

判断整数 1 是否包含在 JSON 整数数组 [1, 2, 3] 中:

1
SELECT json_array_contains(JSON '[1, 2, 3]', 1);
1
2
3
4
 _col0
-------
true
(1 row)

示例 2

判断字符串 1 是否包含在 JSON 整数数组 [1, 2, 3] 中:

1
SELECT json_array_contains(JSON '[1, 2, 3]', '1');
1
2
3
4
 _col0
-------
false
(1 row)

json_array_get(json_array, index) → json

返回 json_array 中指定下标的元素。下标从 0 开始。

警告:这个函数的语义是错误的。如果提取的元素是一个字符串,它会被转换成一个无效的 JSON 值,该值没有正确地加上引号(该值不会被引号包围,任何内部的引号也不会被转义)。
我们不建议使用这个函数。它无法在不影响现有用法的情况下修复,并且在未来的版本中可能会被删除。

示例 1

返回 JSON 数组 [“a”, [3, 9, “D”] 下标为 0 的元素。由于下标为 0 的元素是一个字符串,会被转换成一个无效的 JSON 值,即该值没有被引号包围(正确的结果应该是包含引号的 "a"):

1
SELECT json_array_get('["a", [3, 9, "D"], "c"]', 0);
1
2
3
4
 _col0
-------
a
(1 row)

为更好地说明该函数存在的问题,我们可以将提取出来的结果(JSON 字符串类型)转换为 VARCHAR,此时会报 Cannot cast ‘a’ to varchar 的错误信息:

1
SELECT CAST(json_array_get('["a", [3, 9, "D"], "c"]', 0) AS VARCHAR);
1
failed: Cannot cast 'a' to varchar

正确的 JSON 字符串类型(有被引号包围)转为 VARCHAR 如下:

1
SELECT CAST(JSON '"a"' AS VARCHAR);
1
2
3
4
 _col0
-------
a
(1 row)

示例 2

返回 JSON 数组 [“a”, [3, 9, “D”] 下标为 1 的元素:

1
SELECT json_array_get('["a", [3, 9, "D"], "c"]', 1);
1
2
3
4
   _col0
-----------
[3,9,"D"]
(1 row)

示例 3

该函数也支持负数索引,以获取从数组的末尾索引元素:

1
SELECT json_array_get('["a", [3, 9, "D"], "c"]', -1);
1
2
3
4
 _col0
-------
c
(1 row)

示例 4

如果指定索引的元素不存在,该函数返回 null。如以下查询 SQL 语句均返回 null:

1
2
3
SELECT json_array_get('[]', 0);
SELECT json_array_get('["a", "b", "c"]', 10);
SELECT json_array_get('["c", "b", "a"]', -10);

返回结果:

1
2
3
4
 _col0
-------
NULL
(1 row)

json_array_length(json) → bigint

返回 json(一个包含 JSON 数组的字符串)的数组长度。

示例

1
SELECT json_array_length('[1, 2, 3]');
1
2
3
4
 _col0
-------
3
(1 row)

json_extract(json, json_path) → json

json(一个包含 JSON 的字符串)上计算类似 JSONPath 的表达式 json_path,并将结果作为 JSON 返回。

示例 1

1
SELECT json_extract('{"agent":{"version":"8.6.2","name":"Bai5iewe-103"},"log":{"file":{"path":"/etc/nginx/logs/access.log"},"offset":19991212}}', '$.log.file.path');
1
2
3
4
            _col0
------------------------------
"/etc/nginx/logs/access.log"
(1 row)

示例 2

1
SELECT json_extract('{"agent":{"version":"8.6.2","name":"Bai5iewe-103"},"log":{"file":{"path":"/etc/nginx/logs/access.log"},"offset":19991212}}', '$.log.file');
1
2
3
4
                 _col0
---------------------------------------
{"path":"/etc/nginx/logs/access.log"}
(1 row)

json_extract_scalar(json, json_path) → varchar

json_extract() 类似,但将结果值作为字符串返回(而不是编码为 JSON)。json_path 所引用的值必须是一个标量(布尔值、数字或字符串)。

示例 1

json_path 所引用的值是一个字符串:

1
2
SELECT json_extract_scalar('{"agent":{"version":"8.6.2","name":"Bai5iewe-103"},"log":{"file":{"path":"/etc/nginx/logs/access.log
"},"offset":19991212}}', '$.log.file.path');
1
2
3
4
           _col0
----------------------------
/etc/nginx/logs/access.log
(1 row)

示例 2

json_path 所引用的值是一个 JSON 对象,返回结果为 NULL:

1
SELECT json_extract_scalar('{"agent":{"version":"8.6.2","name":"Bai5iewe-103"},"log":{"file":{"path":"/etc/nginx/logs/access.log"},"offset":19991212}}', '$.log.file');
1
2
3
4
 _col0
-------
NULL
(1 row)

json_format(json) → varchar

返回从输入的 JSON 值序列化的 JSON 文本。这是 json_parse() 的逆函数。

示例 1

1
SELECT json_format(JSON '[1, 2, 3]');
1
2
3
4
  _col0
---------
[1,2,3]
(1 row)

示例 2

1
SELECT json_format(JSON '"a"');
1
2
3
4
 _col0
-------
"a"
(1 row)

注意:json_format()CAST(json AS VARCHAR) 有完全不同的语义。

json_format() 将输入的 JSON 值序列化为符合 RFC 7159 标准的 JSON 文本。JSON 值可以是 JSON 对象、JSON 数组、JSON 字符串、JSON 数字、truefalsenull

序列化 JSON 对象:

1
SELECT json_format(JSON '{"a": 1, "b": 2}');
1
2
3
4
     _col0
---------------
{"a":1,"b":2}
(1 row)

序列化 JSON 数组:

1
SELECT json_format(JSON '[1, 2, 3]');
1
2
3
4
  _col0
---------
[1,2,3]
(1 row)

序列化 JSON 字符串:

1
SELECT json_format(JSON '"abc"');
1
2
3
4
 _col0
-------
"abc"
(1 row)

序列化 JSON 数字:

1
SELECT json_format(JSON '42');
1
2
3
4
 _col0
-------
42
(1 row)

序列化布尔值 true

1
SELECT json_format(JSON 'true');
1
2
3
4
 _col0
-------
true
(1 row)

序列化 null

1
SELECT json_format(JSON 'null');
1
2
3
4
 _col0
-------
null
(1 row)

CAST(json AS VARCHAR) 将 JSON 值转换为对应的 SQL VARCHAR 值。对于 JSON 字符串、JSON 数字、truefalsenull,转换行为与相应的 SQL 类型相同。JSON 对象和 JSON 数组不能转换为 VARCHAR

将 JSON 对象转换为对应的 SQL VARCHAR 值:

1
SELECT CAST(JSON '{"a": 1, "b": 2}' AS VARCHAR);
1
Query failed: Cannot cast '{"a":1,"b":2}' to varchar

将 JSON 数组转换为对应的 SQL VARCHAR 值

1
SELECT CAST(JSON '[1, 2, 3]' AS VARCHAR);
1
Query failed: Cannot cast '[1,2,3]' to varchar

将 JSON 字符串转换为对应的 SQL VARCHAR 值,注意,返回结果中的 abc 没有带双引号:

1
SELECT CAST(JSON '"abc"' AS VARCHAR);
1
2
3
4
 _col0
-------
abc
(1 row)

将 JSON 数字转换为对应的 SQL VARCHAR 值:

1
SELECT CAST(JSON '42' AS VARCHAR);
1
2
3
4
 _col0
-------
42
(1 row)

将 JSON 布尔值 true 转换为对应的 SQL VARCHAR 值

1
SELECT CAST(JSON 'true' AS VARCHAR);
1
2
3
4
 _col0
-------
true
(1 row)

将 JSON null 值转换为对应的 SQL VARCHAR 值:

1
SELECT CAST(JSON 'null' AS VARCHAR);
1
2
3
4
 _col0
-------
NULL
(1 row)

json_parse(string) → json

返回从输入的 JSON 文本反序列化的 JSON 值。这是 json_format() 的逆函数。

示例 1

1
SELECT json_parse('[1, 2, 3]');
1
2
3
4
  _col0
---------
[1,2,3]
(1 row)

示例 2

1
SELECT json_parse('"abc"');
1
2
3
4
 _col0
-------
"abc"
(1 row)

注意:json_parse()CAST(string AS json) 有完全不同的语义。

json_parse() 将符合 RFC 7159 标准的 JSON 文本反序列化为 JSON 值。JSON 值可以是 JSON 对象、JSON 数组、JSON 字符串、JSON 数字、truefalsenull

示例 3

1
SELECT json_parse('not_json');
1
Query failed: Cannot convert 'not_json' to JSON

示例 4

1
SELECT json_parse('{"a": 1, "b": 2}');
1
2
3
4
     _col0
---------------
{"a":1,"b":2}
(1 row)

示例 5

1
SELECT json_parse('[1, 2, 3]');
1
2
3
4
  _col0
---------
[1,2,3]
(1 row)

示例 6

1
SELECT json_parse('"abc"');
1
2
3
4
 _col0
-------
"abc"
(1 row)

示例 7

1
SELECT json_parse('42');
1
2
3
4
 _col0
-------
42
(1 row)

示例 8

1
SELECT json_parse('true');
1
2
3
4
 _col0
-------
true
(1 row)

示例 9

1
SELECT json_parse('null');
1
2
3
4
 _col0
-------
null
(1 row)

CAST(string AS JSON) 函数将任何 VARCHAR 类型的输入值转换为 JSON 字符串格式。

示例 10

1
SELECT CAST('not_json' AS JSON);
1
2
3
4
   _col0
------------
"not_json"
(1 row)

示例 11

1
SELECT CAST('{"a": 1, "b": 2}' AS JSON);
1
2
3
4
         _col0
------------------------
"{\"a\": 1, \"b\": 2}"
(1 row)

示例 12

1
SELECT CAST('[1, 2, 3]' AS JSON);
1
2
3
4
    _col0
-------------
"[1, 2, 3]"
(1 row)

示例 13

1
SELECT CAST('"abc"' AS JSON);
1
2
3
4
   _col0
-----------
"\"abc\""
(1 row)

示例 14

1
SELECT CAST('42' AS JSON);
1
2
3
4
 _col0
-------
"42"
(1 row)

示例 15

1
SELECT CAST('true' AS JSON);
1
2
3
4
 _col0
--------
"true"
(1 row)

示例 16

1
SELECT CAST('null' AS JSON);
1
2
3
4
 _col0
--------
"null"
(1 row)

json_size(json, json_path) → bigint

json_extract() 类似,但返回值的大小。对于对象或数组,大小是成员的数量,标量值的大小是零。

示例 1

返回对象的成员数量:

1
SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x');
1
2
3
4
 _col0
-------
2
(1 row)

示例 2

返回数组的成员数量:

1
SELECT json_size('{"x": [1, 2, 3]}', '$.x');
1
2
3
4
 _col0
-------
3
(1 row)

示例 3

返回标量的成员数量:

1
SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x.a');
1
2
3
4
 _col0
-------
0
(1 row)

(END)