JSON类型

简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于编程语言的 文本格式来存储和表示数据,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON数据类型

JSON中的数据类型包括:对象,字符串,数字,布尔值,NULL,数组。

对象:对象在 JSON 中是使用花括号 {} 包裹起来的内容,数据结构为 {key1:value1, key2:value2, ...} 的属性-值对结构。 key 为对象的属性,value 为对应的值。属性名只能用字符串来表示,值的类型可以是对象,字符串,数字,布尔值,NULL,数组。

数组:数组在 JSON 中是方括号 [] 包裹起来的内容,数据结构为 ["java", "javascript", "vb", ...] 的索引结构。 在 JSON 中,数组的值的类型可以是对象,字符串,数字,布尔值,NULL,数组。

JSON路径

简介:json path值得是数据在json中所处于的位置。用户可以对指定路径或路径下的值进行操作。

json path由$ * . [] key number 构成

$ 表示根路径,所有的路径必须以$开始

[number] 表示数组的第几个元素,从0开始

.key 表示对象中的key值,获取key指向的元素

[*] 表示当前数组中任意元素

.* 表示当前对象中所有key值指向的元素

.** 表示当前及子节点中所有的元素 还有些其它的形式都在结构体JsonPathItemType中

JSON数据的存储方式

方式一:创建表时,直接创建json类型存储json数据。

例:create table test(j json);

方式二:创建表时,创建其它类型(目前支持clob,text和varchar)存储json数据,并使用check约束检查其有效性。

例:(1)create table test(j clob constraint ck1 check(j is json));

(2)create table test(j text constraint ck1 check(j is json));

(3)create table test(j varchar(100) constraint ck1 check(j is json));

示例:

drop table test;
drop table test2;
-- 普通表插入数据
create table test(j json);
--插入符合json格式的数据
insert into test values('{"a":"b"}'),('[1,2,3]'),('"abc"'),('1'),('true'),('null');
--插入不符合json格式的数据
insert into test values('{"a":"b":"c"}');
ERROR, invalid input syntax for type json Expected "," or "}", but found ":".JSON data, line 1: {"a":"b":...


-- 含有check约束的表插入数据
create table test2(j clob constraint ck1 check(j is json));
--插入符合json格式的数据
insert into test2 values('{"a":"b"}'),('[1,2,3]'),('"abc"'),('1'),('true'),('null');
--插入不符合json格式的数据
insert into test2 values('{"a":"b":"c"}');
ERROR, INSERT的数据违反了关系TEST2上的约束CK1


drop table test;
drop table test2;

向JSON中写入数据

-- 表中JSON插入数字,方法一
create table test(j json);
insert into test values(1);

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
NUMBER               |
总数目:1

-- 表中JSON插入数字,方法二
delete from test;
insert into test values('1');

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
NUMBER               |
总数目:1

-- 表中JSON插入布尔值,方法一
delete from test;
insert into test values(true);

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
BOOLEAN              |
总数目:1

-- 表中JSON插入布尔值,方法二
delete from test;
insert into test values('true');

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
BOOLEAN              |
总数目:1

-- 表中JSON插入NULL值
delete from test;
insert into test values('null');

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
NULL                 |
总数目:1

-- 表中JSON插入字符串
delete from test;
insert into test values('"abcd"');

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
STRING               |
总数目:1

-- 表中JSON插入数组,方法一,直接写入
delete from test;
insert into test values('[1,2,3]');

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
ARRAY                |
总数目:1

-- 表中JSON插入数组,方法二,通过JSON_ARRAY()函数构造
delete from test;
insert into test values((select json_array(1,2,3) from dual));

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
ARRAY                |
总数目:1

-- 表中JSON插入对象,方法一,直接写入
delete from test;
insert into test values('{"a":"b","c":"d"}');

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
OBJECT               |
总数目:1

-- 表中JSON插入对象,方法二,通过JSON_OBJECT()函数构造
delete from test;
insert into test values((select json_object('a','b','c','d') from dual));

select json_type(j) from test;
JSON_TYPE(text)      |
---------------------
OBJECT               |
总数目:1

从JSON中读取数据

create table test(id int,j json);
insert into test values(1,'2');
insert into test values(2,'true');
insert into test values(3,'null');
insert into test values(4,'"abcdef"');
insert into test values(5,'[1,2,3]');
insert into test values(6,'{"a":"b","c":"d"}');

-- 方法一,通过select直接读取表中数据
select * from test;
ID(int)      |J(json)      |
--------------------------
1            |2            |
--------------------------
2            |true         |
--------------------------
3            |null         |
--------------------------
4            |"abcdef"     |
--------------------------
5            |[1, 2, 3]    |
--------------------------
6            |{"a": "b", "c|
             |": "d"}      |
总数目:6

-- 方法二,通过json_value读取json数据
select id,json_value(j,'$') from test;
ID(int)      |JSON_VALUE(text)      |
-----------------------------------
1            |2                     |
-----------------------------------
2            |true                  |
-----------------------------------
3            |null                  |
-----------------------------------
4            |abcdef                |
-----------------------------------
5            |[1, 2, 3]             |
-----------------------------------
6            |{"a": "b", "c": "d"}  |
总数目:6

-- 方法三,通过json_extract读取json数据
select id,json_extract(j,'$') from test;
ID(int)      |JSON_EXTRACT(json)      |
-------------------------------------
1            |2                       |
-------------------------------------
2            |true                    |
-------------------------------------
3            |null                    |
-------------------------------------
4            |"abcdef"                |
-------------------------------------
5            |[1, 2, 3]               |
-------------------------------------
6            |{"a": "b", "c": "d"}    |
总数目:6