JSON是基于纯文本的轻量级数据交换格式,在web应用端有广泛的应用。在DM中JSON数据以字符串类型储存,可以支持对于要存入的JSON数据格式的正确性检查,存储JSON数据并提供函数对于JSON文本进行查询。下面用几个例子来说明在DM中操作JSON文本的方法。
创建TEST1表并在TEST1表中存储JSON文本,INFO列的数据类型需要为字符类型,可以选择varchar、varchar2、char、clob等作为储存字段的数据类型。
create table TEST1 (INFO varchar(100));
insert into TEST1 values ('{"db_name":"DM","version":8}');
select * from TEST1;
对于储存下来的JSON数据,DM提供了函数json_value和json_query对于JSON文本中的值进行查询。现运用json_value函数查询键为db_name所对应的值。使用函数json_value必须给定两个参数,第一个为查询表中的列名,第二个为查找值的路径表达式。在路径中array对象和object对象必须以“$”开头。
select json_value(INFO,'$.db_name') from TEST1;
通过查询可以获取到db_name所对应的值为“DM”。除了如上例中object对象外,DM还可以存储array对象并查询array中的值。数组的下标从0开始,利用“[下标]”的方式可以查找到对应的值。
create table TEST2 (INFO char(100));
insert into TEST2 values ('["DAMENG",8,true,null]');
select * from TEST2;
select json_value(INFO,'$[0]') from TEST2;
对于需要储存的数据检查其是否为json文本,可以加入IS JSON条件进行判断。可以在建表的过程中加入到检查约束中进行判断,也可以在插入数据时添加条件,对于插入的数据进行筛选。
create table TEST3(ID int,INFO varchar(100) constraint json_check check (INFO is json));
insert into TEST3 values (1,'{"db_name":"DM","version":8}');
符合json数据格式的值会被存储下来,而错误的格式在插入数据时不能满足IS JSON的检查约束,会提示“违反CHECK约束[JSON_CHECK]”。
insert into TEST3 values (2,'{"db_name":"DM","version":8,????:!!!!}');
insert into TEST3 values (3,'DAMENG');
如果不添加约束,也可以在条件中筛选json格式的数据,例如在下面的示例中我们创建TEST4表,并插入四行数据,其中两行符合json数据的合法性。
create table TEST4(ID int,INFO varchar(100));
insert into TEST4 values (1,'{"db_name":"DM","version":8}');
insert into TEST4 values (2,'{"db_name":"DM","version":8,????:!!!!}');
insert into TEST4 values (3,'DAMENG');
insert into TEST4 values (4,'["DAMENG",8,true,null]');
而在创建TEST5表的时候在where子句中带上对于json数据的检查条件,可以仅将符合json数据插入到TEST5中。
create table TEST5 as select * from TEST4 where INFO is json;
select * from TEST5;
在筛选时也可以指定条件为IS NOT JSON来排除掉json格式的数据。
insert into TEST5 select * from TEST4 where INFO is not json;
select * from TEST5;
函数json_query的参数必选项与json_value相似,都需要列名与路径表达式。而不同的是json_query返回单值或多值,在返回多值时必须指定WITH WRAPPER。json_query函数返回的结果是数组类型。
create table TEST6 (ID int,INFO varchar(100));
insert into TEST6 values (1,'{"db_name":"DM","edition":"开发版"}');
insert into TEST6 values (2,'{"db_name":"DM","edition":"标准版"}');
insert into TEST6 values (3,'{"db_name":"DM","edition":"企业版"}');
insert into TEST6 values (4,'{"db_name":"DM","edition":"安全版"}');
select json_query(INFO,'$.edition' with wrapper) from TEST6;
对于带有json数据的检查约束进行查询,可以通过数据字典user_json_columns、all_json_columns、dba_json_columns查询到相关的结果。在前面的例子中TEST3表添加了列级的检查约束用于检查该列json格式的合法性,以查询all_json_columns为例,查询结果如下:
select * from all_json_columns;
而对于与JSON相关的表级约束,如果约束中的判断条件为“与”关系,则在数据字典all_json_columns中相关列的信息都会显示在其中;而如果约束中判断条件为“或”关系,则两者都不会在all_json_columns中体现,即使“或”关系中两者的判断条件都是IS JSON。而IS NOT JSON的条件在无论是单独的约束,或者和其他条件以“与”或者“或”关系一起进行组成约束条件,都不会在all_json_columns中出现。
create table TEST7 (ID int,INFO varchar(100));
alter table TEST7 add constraint json_check1 check (ID ='1' and INFO is json);
create table TEST8 (name varchar(100),INFO varchar(100));
alter table TEST8 add constraint json_check3 check (NAME is json or INFO is json);
select * from all_json_columns;
从结果中可以看到TEST7的两列都在all_json_columns中,而TEST8中约束条件里的列都不在all_json_columns中,因此有可能部分约束中对于是否json数据的判断起到了约束作用,而all_json_columns中没有反映出,我们在设置json的约束时应该注意到这一点。