更新时间:2025-09-12 GMT+08:00
分享

JSON类型

M-Compatibility支持的JSON类型请参见表1

表1 JSON类型

名称

描述

存储空间

JSON

非结构化的数据类型,用于存储和操作JSON数据。

  • 输入格式:
    标量:
    • 空类型:null,全小写。
    • bool类型:仅true和false,全小写。
    • 数字类型:正整数、负整数、小数和0,支持科学计数法。不支持多余的前导0、正数前的+号、NaN和inf。
    • 字符串类型:必须加双引号。

    数组:[]结构,存放的元素可以是任意类型的JSON,不要求数组内所有元素类型一致。

    对象:{}结构,存储{key:value}的键值对,key只能是带有双引号的字符串,value可以是任意类型的JSON。对于重复的key,以第一个键值对{key:value}为准。

  • 输出格式:

    文本解析成JSON类型后,会忽略无关语义的细节,如空格。

    对象类型的格式归一化:

    • 删除key重复的键值对{key:value},只保留第一个出现的键值对{key:value}。
    • 键值对{key:value}会重新进行排序,排序规则:key长度长的位于较后位置,key长度相等则ASCII码较大的位于较后位置。
  • 取值范围:
    • 数字类型取值范围与FLOAT8类型相同:最小值-1.797693e+308,最大值1.797693e+308,超出取值范围则报错。
    • 数组和对象类型的最大嵌套深度为100。

最大为1073741817个字节。

  • JSON数据类型的输入合法校验不受GUC参数sql_mode影响。sql_mode为任意取值时,JSON类型列输入不合法的字符时,都会产生ERROR。
  • JSON数据类型不支持作为主键和索引键以及作为分区键。
  • 当插入JSON类型列的整数大于无符号整数类型最大值2^64 - 1或小于有符号整数类型最小值-2^63时,会作为DOUBLE类型存储,对精度会产生部分差异。
  • 为了与GaussDB非M-Compatibility模式数据库(即GaussDB原有)的JSON类型区分,M-Compatibility模式数据库内新增GUC参数m_format_behavior_compat_options的兼容性选项cast_as_new_json。
    • 该选项开启时,执行::JSON、CREATE TABLE <tablename> AS <包含JSON类型的SELECT查询>; 等涉及通过::JSON方式执行JSON类型转换的场景,实际转换为M-Compatibility模式数据库的JSON类型。
    • 如果不开启该选项,相关JSON类型转换的场景实际转换为非M-Compatibility模式数据库(即GaussDB原有)的JSON类型。
    • 该选项在数据库实例初始化后默认开启,但如果需要显式指定m_format_behavior_compat_options兼容性参数的值并使用M-Compatibility模式数据库内的JSON类型,为保证功能符合预期,需要补充设置cast_as_new_json参数。如:
      SET m_format_behavior_compat_options = 'xxx,xxx,cast_as_new_json';
  • 为了与原有的JSON类型区分,M-Compatibility中的JSON类型在pg_type系统表中的typname名称为“jsonm”。
    • 在SQL语法中,JSON相当于JSONM的别名,但JSONM不可作为数据类型名称使用。
    • “jsonm”字样可能会在错误信息等文本中出现,用户可将其看作JSON类型。
    • pg_type系统表中typname名称为“json”和“jsonb”的数据类型为原有的JSON类型,在M-Compatibility中已废弃,请勿使用相关的内部函数,例如:“json_in”、“jsonb_in”等。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
-- 创建列类型为JSON数值类型的表。
m_db=# CREATE TABLE test_json (id INT, json_value JSON);
CREATE TABLE
-- 插入空类型标量
m_db=# INSERT INTO test_json VALUES(1, 'null');
INSERT 0 1
-- 插入数字类型标量
m_db=# INSERT INTO test_json VALUES(2, '-1.5e+2');
INSERT 0 1
-- 插入bool类型标量
m_db=# INSERT INTO test_json VALUES(3, 'true');
INSERT 0 1
m_db=# INSERT INTO test_json VALUES(4, 'false');
INSERT 0 1
-- 插入字符串类型标量
m_db=# INSERT INTO test_json VALUES(5, '"abc"');
INSERT 0 1
-- 插入数组
m_db=# INSERT INTO test_json VALUES(6, '[1, 2, "json", null, [[]], {}]');
INSERT 0 1
-- 插入对象
m_db=# INSERT INTO test_json VALUES(7, '{"jsnid": [true, "abc"], "tag": {"ab": 1, "b": null, "a": 2}}');
INSERT 0 1
-- 查询表中的数据
m_db=# SELECT * FROM test_json;
 id |                          json_value                           
----+---------------------------------------------------------------
  1 | null
  2 | -150
  3 | true
  4 | false
  5 | "abc"
  6 | [1, 2, "json", null, [[]], {}]
  7 | {"tag": {"a": 2, "b": null, "ab": 1}, "jsnid": [true, "abc"]}
(7 rows)

-- 非法输入报错
m_db=# INSERT INTO test_json VALUES(1, '+20');
ERROR:  invalid input syntax for type json
LINE 1: INSERT INTO test_json VALUES(1, '+20');
                                        ^
DETAIL:  Token "+" is invalid.
CONTEXT:  JSON data, line 1: +...
referenced column: json_value
m_db=# INSERT INTO test_json VALUES(1, 'NaN');
ERROR:  invalid input syntax for type json
LINE 1: INSERT INTO test_json VALUES(1, 'NaN');
                                        ^
DETAIL:  Token "NaN" is invalid.
CONTEXT:  JSON data, line 1: NaN
referenced column: json_value
m_db=# INSERT INTO test_json VALUES(1, 'inf');
ERROR:  invalid input syntax for type json
LINE 1: INSERT INTO test_json VALUES(1, 'inf');
                                        ^
DETAIL:  Token "inf" is invalid.
CONTEXT:  JSON data, line 1: inf
referenced column: json_value
m_db=# INSERT INTO test_json VALUES(1, 'NULL');
ERROR:  invalid input syntax for type json
LINE 1: INSERT INTO test_json VALUES(1, 'NULL');
                                        ^
DETAIL:  Token "NULL" is invalid.
CONTEXT:  JSON data, line 1: NULL
referenced column: json_value
m_db=# INSERT INTO test_json VALUES(1, 'TRUE');
ERROR:  invalid input syntax for type json
LINE 1: INSERT INTO test_json VALUES(1, 'TRUE');
                                        ^
DETAIL:  Token "TRUE" is invalid.
CONTEXT:  JSON data, line 1: TRUE
referenced column: json_value
m_db=# INSERT INTO test_json VALUES(1, '000123');
ERROR:  invalid input syntax for type json
LINE 1: INSERT INTO test_json VALUES(1, '000123');
                                        ^
DETAIL:  Token "000123" is invalid.
CONTEXT:  JSON data, line 1: 000123
referenced column: json_value
m_db=# INSERT INTO test_json VALUES(1, 'abc');
ERROR:  invalid input syntax for type json
LINE 1: INSERT INTO test_json VALUES(1, 'abc');
                                        ^
DETAIL:  Token "abc" is invalid.
CONTEXT:  JSON data, line 1: abc
referenced column: json_value
m_db=# INSERT INTO test_json VALUES(1, '{12:"abc"}');
ERROR:  invalid input syntax for type json
LINE 1: INSERT INTO test_json VALUES(1, '{12:"abc"}');
                                        ^
DETAIL:  Expected string or "}", but found "12".
CONTEXT:  JSON data, line 1: {12...
referenced column: json_value

-- 删除表
m_db=# DROP TABLE test_json;

相关文档