JSON

JSON(JavaScript Object Notation)是完全独立于语言的文本格式,是一种轻量级的数据交换格式。

DM数据库支持对JSON数据进行存储和查询。在DM 数据库中JSON数据以字符串形式存储。DM建议用户在插入JSON数据之前,使用IS JSON来验证输入JSON数据的正确性。

本章中的例子,除了特殊说明之外,建表语句都请参考18.5一个简单的例子

18.1 数据类型

JSON支持的数据类型包括:字符串string、数字number、布尔值true和false、 null、对象object和数组array。JSON的各种数据类型可以嵌套使用。

图例

JSON数据类型

JSON数据类型

18.1.1 string

字符串长度需要大于等于0,可以为空串。一般建议使用引号将string括起,DM支持双引号和单引号。string作为名称,在IS JSON(LAX)情况下可以不用引号,但作为值时必须使用引号。语法图中第一个反斜杠“\”表示转义字符。

图例

JSON string

JSON的string类型

使用说明

字符串必须以a-z或A-Z开始,后续字符可以包含0-9;如果不遵守这个规则或者包含其他字符,则必须以引号括起。只有空格能够以“”的形式出现在字符串中,其他特殊字符则不可以。

18.1.2 number

数字不支持八进制和十六进制。

图例

JSON number

JSON的number类型

18.1.3 true、false

true和false代表布尔值,使用时不需要加引号。一般作为值,但也可以作为名称。

插入JSON列时,必须注意以下2点:

  1. true和false作为值。IS JSON (strict)时必须是小写,否则报错;IS JSON (lax)时,则不区分大小写,如:TRUE、True、tRue均是合法的。但查询语句中都必须以小写形式返回值。
  2. true和false作为名称。这是一种特殊的用法,一般不建议这样用。仅在IS JSON (lax)时支持,否则报错。因为用法特殊,不管在名称中大小写与否,查询语句中都只有小写才能返回对应的值。

举例说明

  drop table t_json_boolean CASCADE;

  create table t_json_boolean(c1 int,

  c2 varchar2(100) CHECK (c2 IS JSON(STRICT)),

  c3 varchar2(100) CHECK (c3 IS JSON(LAX))

  );

  insert into t_json_boolean values(1,'{"dameng":TRUE}',NULL);

  --违反CHECK约束,需要将TRUE修改为true

  insert into t_json_boolean values(2,NULL,'{"dameng":TRUE}');

  --插入成功,LAX不区分大小写

  insert into t_json_boolean values(3,'{true:1}',NULL);

  --违反CHECK约束,STRICT时true和false不能作为名称

  insert into t_json_boolean values(4,NULL,'{TRUE:1}');

  --插入成功,LAX时true和false可以作为名称且不区分大小写

  commit;

  select C1,json_value(c3, '$.dameng') from t_json_boolean

  --运行结果:

  2			true

  4			NULL

  select C1,json_value(c3, '$.dameng' returning number) from t_json_boolean;

  --运行结果:

  2			1

  4			NULL

  select C1,json_value(c3, '$.true') from t_json_boolean;

  --运行结果:

  2			NULL

  4			1

  select C1,json_value(c3, '$.TRUE') from t_json_boolean;

  --运行结果:

  2			NULL

  4			NULL

18.1.4 null

null代表JSON数据为空,它与SQL语句中的值为NULL是不同的。null使用时不需要加引号,一般作为值,但也可以作为名称。

插入JSON列时,必须注意以下3点:

  1. null作为值。IS JSON (STRICT)时必须是小写,否则报错;IS JSON (LAX)时,则不区分大小写,如:NULL、nUll、nULL均是合法的。
  2. json_value时,null以SQL语句NULL的形式返回,此时无法区分是SQL的NULL还是json数据的null;json_query时,null返回必须指定WITH WRAPPER的形式返回,如[null],查询语句中必须以小写形式才能有返回值。
  3. null作为名称。这是一种特殊的用法,一般不建议这样用。仅在IS JSON (LAX)时支持,否则报错。因为用法特殊,不管名称中的大小写,查询语句中都只有小写才能返回对应的值。

从上可以看出,null的使用规则(1)(3)与true、false的使用规则基本一致。

举例说明

  drop table t_json_null;

  create table t_json_null(c1 int,

  c2 varchar2(100) CHECK (c2 is json));

  insert into t_json_null values(1,null);				--SQL语句的null

  insert into t_json_null values(2,'{"dameng":null}');	--json数据的null

  insert into t_json_null values(3,NULL);				--SQL语句的null

  insert into t_json_null values(4,'{"dameng":NULL}');	--json数据的null

  commit;

  SQL> select json_value(c2, '$.dameng') from t_json_null;

  行号	   JSON_VALUE(C2,'$.dameng')

---------- -------------------------

  1			NULL

  2			NULL

  3			NULL

  4			NULL

  --第2、4行全部转化为SQL的NULL。和第1、2行一样。

  SQL> select json_query(c2, '$.dameng' WITH WRAPPER) from t_json_null;

  行号	   json_query(C2,'$.dameng'WITHWRAPPER)

---------- ------------------------------------

  1			NULL

  2			[null]

  3			NULL

  4			[null]

  --查询可以看出四行数据的不同。2、4行为json数据。

18.1.5 object

对象以“{”开始,“}”结束。名称/值对的书写格式:<string>:<value>。

语法格式

JSON object

JSON的object类型

<string>:对象名称。字符串类型。

<value>:对象值。数据库列类型。

例如,向t1表中插入object值对。

create table t1(c1 varchar);

insert into t1 values('{a:100, b:200, c:{d:300, e:400}}');

SELECT * FROM T1, JSON_TABLE(T1.C1, '$.c' COLUMNS(C1 NUMBER PATH '$.d', C2 NUMBER PATH '$.e'));

18.1.6 array

数组是<值>的有序集合,数组在[]中书写。

语法格式

JSON array

JSON的array类型

<value>:可以有0或多个value,value可以是数据类型中的任何一种。

18.2 函数

18.2.1 json_value

json_value函数的返回值必须是单值且是标量数据类型。

语法格式

  <json_value函数> ::= JSON_VALUE(<参数1> , <参数2>

  [<RETURNING 项>] [ASCII] [<ERROR项>])

  <参数1> ::= <列名>|<json数据>

  <参数2> ::= <路径表达式>

  <RETURNING 项> :: = RETURNING <json数据类型>

  <json数据类型>::=STRING|NUMBER|TRUE|FALSE|NULL

  <ERROR项> :: = <NULL | ERROR | <DEFAULT项>> ON ERROR

  <DEFAULT项> :: = DEFAULT '<value>'

参数

<参数1>:必须是json数据类型的对象object、数组array或NULL(注意:sql的NULL,非json的null),否则函数报错。

<参数2>:路径表达式,请参考18.2.12.1 路径表达式

<RETURNING 项>:返回值类型,默认为VARCHAR(8188)。出错时默认为NULL ON ERROR;

<default项>:返回值必须与<RETURNING 项>中定义的类型匹配。当RETURNING字符串时,默认值可以是数字或字符串。布尔类型有两种表示方法:一是返回'true'和'false'(VARCHAR类型),二是返回1和0(NUMBER类型)。

使用说明

(1) 数据类型中的string表示变长字符串,具体包括:varchar,varchar2,clob,varbinary等,可以指定精度,如:varchar(100)。

(2) 数据类型中的number对应dm的dec类型,可以有多种写法,如:decimal,也可以指写精度,例如:dec(10,5)。

(3) true和false在指定returning number时返回值对应1和0。

举例说明:

  1. 使用json_value查询对象的值。
  SQL> SELECT ID,json_value(po_document, '$.Requestor') FROM j_purchaseorder;

  行号		ID		JSON_VALUE(PO_DOCUMENT,'$.Requestor')

----------------- -----------------------------------------------------

  1			 1		 Alexis Bull
  1. 使用json_value查询数组的值。
  SQL> SELECT ID,json_value(po_document, '$.ShippingInstructions.Phone[1].type') FROM j_purchaseorder;

  行号		ID		JSON_VALUE(PO_DOCUMENT,'$.ShippingInstructions.Phone[1].type')

------------------------------------------------------------------------

  1			 1		 Mobile

18.2.2 json_query

json_query的返回结果是一个或多个JSON数据。多值返回时必须指定with wrapper。单值返回时,标量类型必须指定with wrapper,object或array则不需要。

语法格式

  <json_query函数> ::= json_query(<参数1>,<参数2> [<RETURNING项>] [PRETTY] [ASCII]

  [<WRAPPER项>] [<ERROR项>])

  <参数1> ::=  <列名>| <json数据>
  
  <参数2> ::=  <路径表达式>
  
  <RETURNING 项> :: = RETURNING <json数据类型>
  
  <json数据类型>::=STRING| TRUE| FALSE| NULL

  <WRAPPER 项> :: = WITH[CONDITIONAL|UNCONDITIONAL](#) WRAPPER|

					WITHOUT[ARRAY]WRAPPER

  <ERROR项> :: = < NULL | ERROR | EMPTY> ON ERROR

参数

<参数1>: 必须是json数据类型,否则函数报错。具体数据类型,请参考18.1节。

<参数2>: 路径表达式,请参考18.2.12.1 路径表达式

<RETURNING 项>:返回值类型,默认为VARCHAR(8188)。出错时默认为NULL ON ERROR;

<数据类型>:使用方法请参考json_value。

举例说明

  1. 使用json_query,以数组的形式返回JSON数据。
  SQL> select json_query(po_document,'$.PONumber' returning varchar2 with wrapper) FROM j_purchaseorder;

  行号		json_query(PO_DOCUMENT,'$.PONumber'WITHWRAPPER)

------------------------------------------------------------------------

  1			 [1600]

18.2.3 jsonb_each

jsonb_each将最外层JSON对象扩展为一组键/值对。

语法格式

  <jsonb_each函数> ::= jsonb_each(<JSON_exp1>) 

参数

<JSON_exp1>: 表示JSON的字符串,数据类型为VARCHAR或CLOB。

返回值

返回值表的结构为(key,value)。

key:JSON对象名称/值对中的“名称”,数据类型与参数<JSON_exp1>的数据类型保持一致,为VARCHAR或CLOB。

value:key对应JSON的字符串,数据类型与参数<JSON_exp1>的数据类型保持一致,为VARCHAR或CLOB。

使用说明

  1. 当参数<JSON_exp1>为NULL时,返回的结果集为空集。
  2. 参数<JSON_exp1>对应的JSON数据类型必须为OBJECT,否则报错。
  3. MPP环境下不支持该函数。

举例说明

  1. 使用jsonb_each,将最外层JSON对象扩展为键/值对。
  SQL>   select * from jsonb_each('{"a":1,"b":true,"c":null,"d":"str\ttest","e":[1,2,3],"f":{"name1":"aaa\ttest","name2":"bbb\ttest"}}');

  行号     KEY VALUE
  ---------- --- -----------------------------------------
  1          a   1
  2          b   true
  3          c   null
  4          d   "str\ttest"
  5          e   [1,2,3]
  6          f   {"name1":"aaa\ttest","name2":"bbb\ttest"}
  1. 当参数<JSON_exp1>为NULL时,返回的结果集为空集。
  SQL>   select * from jsonb_each(null);
  未选定行
  1. 当参数<JSON_exp1>对应的JSON数据类型不是OBJECT时,报错。
  SQL>   select * from jsonb_each('[1,2,3]');
  [-3117]:只能在对象上调用此函数.

18.2.4 jsonb_each_text

jsonb_each_text将最外层JSON对象扩展为一组键/值对。

语法格式

  <jsonb_each_text函数> ::= jsonb_each_text(<JSON_exp1>) 

参数

<JSON_exp1>: 表示JSON的字符串,数据类型为VARCHAR或CLOB。

返回值

返回值表的结构为(key,value)。

key:JSON对象名称/值对中的“名称”,数据类型与参数<JSON_exp1>的数据类型保持一致,为VARCHAR或CLOB。

value:key对应JSON的字符串,数据类型与参数<JSON_exp1>的数据类型保持一致,为VARCHAR或CLOB。

使用说明

jsonb_each_text与jsonb_each的区别仅在于:jsonb_each_text当value的返回结果为JSON STRING类型时,将其转换为相应值的字符串,例如将其中的转义字符“\t”转换为tab键。

举例说明

  1. 使用jsonb_each_text,将最外层JSON对象扩展为键/值对。
  SQL>   select * from jsonb_each_text('{"a":1,"b":true,"c":null,"d":"str\ttest","e":[1,2,3],"f":{"name1":"aaa\ttest","name2":"bbb\ttest"}}');

  行号     KEY VALUE
  ---------- --- -----------------------------------------
  1          a   1
  2          b   true
  3          c   null
  4          d   str test
  5          e   [1,2,3]
  6          f   {"name1":"aaa\ttest","name2":"bbb\ttest"}

其中,对于字符串“str\ttext”,字符串中的转义字符“\t”被改写成了对应的tab键。

18.2.5 jsonb_array_elements

jsonb_array_elements将JSON数组扩展为JSON值的集合。

语法格式

  <jsonb_array_elements函数> ::= jsonb_array_elements(<JSON_exp1>) 

参数

<JSON_exp1>: 表示JSON的字符串,数据类型为VARCHAR或CLOB。

返回值

返回值表的结构为(value)。

value:数组下标对应JSON的字符串,数据类型与参数<JSON_exp1>的数据类型保持一致,为VARCHAR或CLOB。

使用说明

  1. 当参数<JSON_exp1>为NULL时,返回的结果集为空集。
  2. 参数<JSON_exp1>对应的JSON数据类型必须为ARRAY,否则报错。
  3. MPP环境下不支持该函数。

举例说明

  1. 使用jsonb_array_elements,将JSON数组扩展为JSON值的集合。
  SQL>   select * from jsonb_array_elements('[1, true, null, "str\ttest", [1,2,3], {"name1":"aaa\ttest","name2":"bbb\ttest"}]');

  行号     VALUE                          
  ---------- -----------------------------------------
  1          1
  2          true
  3          null
  4          "str\ttest"
  5          [1,2,3]
  6          {"name1":"aaa\ttest","name2":"bbb\ttest"}
  1. 当参数<JSON_exp1>为NULL时,返回的结果集为空集。
  SQL>   select * from jsonb_array_elements(null);
  未选定行
  1. 当参数<JSON_exp1>对应的JSON数据类型不是ARRAY时,报错。
  SQL>   select * from jsonb_array_elements('1');
  [-3117]:只能从数组中提取元素.

18.2.6 jsonb_array_elements_text

jsonb_array_elements_text将JSON数组扩展为JSON值的集合。

语法格式

  <jsonb_array_elements_text函数> ::= jsonb_array_elements_text(<JSON_exp1>)

参数

<JSON_exp1>: 表示JSON的字符串,数据类型为VARCHAR或CLOB。

返回值

返回值表的结构为(value)。

value:数组下标对应JSON的字符串,数据类型与参数<JSON_exp1>的数据类型保持一致,为VARCHAR或CLOB。

使用说明

jsonb_array_elements_text与jsonb_array_elements的区别仅在于:jsonb_array_elements_text当value的返回结果为JSON STRING类型时,将其转换为相应值的字符串,例如将其中的转义字符“\t”转换为tab键。

举例说明

  1. 使用jsonb_array_elements_text,将JSON数组扩展为JSON值的集合。
  SQL>   select * from jsonb_array_elements_text('[1, true, null, "str\ttest", [1,2,3], {"name1":"aaa\ttest","name2":"bbb\ttest"}]');

  行号     VALUE                          
  ---------- -----------------------------------------
  1          1
  2          true
  3          null
  4          str test
  5          [1,2,3]
  6          {"name1":"aaa\ttest","name2":"bbb\ttest"}

其中,对于字符串“str\ttext”,字符串中的转义字符“\t”被改写成了对应的tab键。

18.2.7 jsonb_strip_nulls

当JSON对象OBJECT名称/值对中的值为NULL时,jsonb_strip_nulls忽略该名称/值对,并返回处理后的JSON字符串。

语法格式

  <jsonb_strip_nulls函数> ::= jsonb_strip_nulls(<JSON_exp1>)

参数

<JSON_exp1>: 表示JSON的字符串,数据类型为VARCHAR或CLOB。

返回值

返回结果为JSON字符串,数据类型与参数<JSON_exp1>的数据类型保持一致,为VARCHAR或CLOB。

使用说明

  1. 当参数<JSON_exp1>为NULL时,返回NULL。
  2. 该函数不会忽略除OBJECT类型外其他JSON数据类型中的NULL值。

举例说明

  1. 使用jsonb_strip_nulls,忽略“值”为NULL的OBJECT名称/值对。
  SQL>   select jsonb_strip_nulls('[1, null, "str", [1,2,null], {"a":null}, {"b":2, "c":null}]') from dual;

  行号     JSONB_STRIP_NULLS('[1,null,"str",[1,2,null],{"a":null},{"b":2,"c":null}]')
  ---------- --------------------------------------------------------------
  1          [1,null,"str",[1,2,null],{},{"b":2}]
  1. 当参数<JSON_exp1>为NULL时,返回NULL。
  SQL>   select jsonb_strip_nulls(null) from dual;
  
  行号     JSONB_STRIP_NULLS(NULL)
  ---------- -----------------------
  1          NULL

18.2.8 jsonb_set

jsonb_set替换JSON字符串中用户指定的项,并返回替换后的JSON字符串。

语法格式

  <jsonb_set函数> ::= jsonb_set(<JSON_exp1>, <path_exp2>, <JSON_exp3>[, <exp4>]) 

参数

<JSON_exp1>:表示目标JSON的字符串,数据类型为VARCHAR或CLOB。

<path_exp2>:路径表达式,以“{”开始,并以“}”结束。函数通过<path_exp2>指定的路径在<JSON_exp1>中查找相应的项并进行替换。该路径表达式的语法图如下:

jsonb_set.png

“路径标识符”表示JSON数组ARRAY的下标,或者JSON对象OBJECT的名称/值对的“名称”。当“路径标识符”表示JSON数组ARRAY的下标且为负整数时,表示从JSON数组的末尾开始计数,-1表示数组末尾的第一位。路径表达式中可以包含多个“路径标识符”,以“,”分隔。更多关于路径表达式的介绍请参考18.2.12.1 路径表达式

<JSON_exp3>:表示新替换JSON的字符串,数据类型为VARCHAR或CLOB。

<exp4>:表示当<path_exp2>指定的项不存在时,是否新增<path_exp2>指定的项,并将值设为<JSON_exp3>,取值为TRUE(是)、FALSE(否),默认为TRUE。

返回值

返回结果为JSON字符串,数据类型与参数<JSON_exp1>的数据类型保持一致,为VARCHAR或CLOB。

使用说明

  1. 当参数<JSON_exp1>为NULL时,返回NULL。
  2. 参数<JSON_exp1>对应的JSON数据类型只能为OBJECT或ARRAY,否则报错。
  3. 当参数<path_exp2>的“路径标识符”对应项的JSON类型是ARRAY时,该“路径标识符”必须为整数,否则报错。
  4. 当参数<path_exp2>的“路径标识符”对应项的JSON类型是OBJECT时,该“路径标识符”无论是数值还是字符串都将作为OBJECT名称/值对中的“名称”处理。
  5. 当OBJECT名称/值对中的“名称”包含转义字符时,“路径标识符”描述该“名称”时需要将转义字符改写为相应字符。例如名称/值对中的“名称”为“a\tb”,“路径标识符”需要写成“a b”(中间为tab键),才能成功查找到指定项。

举例说明

  1. 使用jsonb_set,替换JSON字符串中的一项。
  --替换为NUMBER类型
  SQL>   select jsonb_set('[{"f1":{"a":1}}]','{0,f1,a}','15') from dual;

  行号     JSONB_SET('[{"f1":{"a":1}}]','{0,f1,a}','15')
  ---------- ---------------------------------------------
  1          [{"f1":{"a":15}}]

  --替换为STRING类型
  SQL>   select jsonb_set('[{"f1":{"a":1}}]','{0,f1,a}','"str"') from dual;

  行号     JSONB_SET('[{"f1":{"a":1}}]','{0,f1,a}','"str"')
  ---------- ------------------------------------------------
  1          [{"f1":{"a":"str"}}]

  --<path_exp2>指定项不存在,且<exp4>为TRUE,则<JSON_exp1>新增一项
  SQL> select jsonb_set('[{"f1":{"a":1}}]','{0,f1,b}','15',true) from dual;

  行号     JSONB_SET('[{"f1":{"a":1}}]','{0,f1,b}','15',TRUE)
  ---------- --------------------------------------------------
  1          [{"f1":{"a":1,"b":15}}]

  --<path_exp2>指定项不存在,且<exp4>为FALSE,则<JSON_exp1>保持不变
  SQL>select jsonb_set('[{"f1":{"a":1}}]','{0,f1,b}','15',false) from dual;

  行号     JSONB_SET('[{"f1":{"a":1}}]','{0,f1,b}','15',FALSE)
  ---------- ---------------------------------------------------
  1          [{"f1":{"a":1}}]
  1. 当参数<JSON_exp1>为NULL时,返回NULL。
  SQL>   select jsonb_set(null,'{0,f1,a}','15') from dual;

  行号     JSONB_SET(NULL,'{0,f1,a}','15')
  ---------- -------------------------------
  1          NULL
  1. 当参数<JSON_exp1>对应的JSON数据类型不是OBJECT或ARRAY时,报错。
  SQL>   select jsonb_set('1','{}','15') from dual;
  [-3114]:无法在标量中设置路径.

18.2.9 jsonb_object_agg

jsonb_object_agg将两个参数聚合成一个JSON对象OBJECT。

语法格式

  <jsonb_object_agg函数> ::= jsonb_object_agg(<name>, <value>[, IS_JSONB]) 

参数

<name>:作为JSON对象OBJECT名称/值对中的“名称”,数据类型为VARCHAR。

<value>:作为JSON对象OBJECT名称/值对中的“值”,支持的数据类型包括:VARCHAR、CLOB、VARBINARY、BLOB、INT、BIGINT、DEC以及JSON类型。

IS_JSONB:表示参数<value>是否为JSONB字符串,取值为0(否)、1(是),默认为0。IS_JSONB仅在参数<value>的数据类型为VARCHAR或CLOB时才有效,其他情况下忽略该参数值。

返回值

返回结果为CLOB数据类型,表示聚合成的JSON字符串。

使用说明

  1. 参数<name>的值不能为NULL,否则报错。
  2. 如果参数<name>或<value>的值中包含转义字符,则函数将转义字符改写为“\”表示的转义字符。例如<value>的值为“a b”(中间为tab键),则聚合时改写为“a\tb”。

举例说明

  1. 使用jsonb_object_agg,将表中的两列聚合成JSON对象OBJECT。
  SQL>   drop table test;
  SQL>   create table test(c1 varchar(20),c2 varchar(20));
  SQL>   insert into test values('a',1);
  SQL>   insert into test values('b','true');
  SQL>   insert into test values('c',null);
  SQL>   insert into test values('d','[1,2,3]');
  SQL>   insert into test values('e','str\ttest');
  SQL>   insert into test values('f','"str	test"');
  SQL>   insert into test values('str	test','{"name":"str	test"}');
  SQL>   select jsonb_object_agg(c1,c2) from test;

  行号     JSONB_OBJECT_AGG(C1,C2)
  ---------- -------------------------------
  1          {"a":"1","b":"true","c":null,"d":"[1,2,3]","e":"str\\ttest","f":"\"str\ttest\"","str\ttest":"{\"name\":\"str\ttest\"}"}

可以看出,c1和c2列中的“\”、“"”以及tab键聚合时分别被改写成了“\”、“"”以及“\t”。

  1. 参数<name>的值为NULL,报错。
  SQL>   drop table test;
  SQL>   create table test(c1 varchar(20),c2 varchar(20));
  SQL>   insert into test values(null,1);
  SQL>   select jsonb_object_agg(c1,c2) from test;
  [-3116]:字段名能为空.

18.2.10 jsonb_concat

jsonb_concat将两个JSONB字符串合并成一个JSONB字符串。

语法格式

<jsonb_concat函数> ::= jsonb_concat(<JSONB_exp1>,<JSONB_exp2>)

参数

<JSONB_exp1>:表示JSONB的字符串,数据类型为VARCHAR或CLOB。

<JSONB_exp2>:表示JSONB的字符串,数据类型为VARCHAR或CLOB。

返回值

合并后的JSONB字符串。如果<JSON_exp1>和<JSON_exp2>的数据类型均为VARCHAR,则返回值的数据类型也为VARCHAR;否则,返回值的数据类型为CLOB。

使用说明

  1. 当参数<JSONB_exp1>或<JSONB_exp2>为NULL时,则返回NULL;
  2. 当参数<JSONB_exp1>或<JSONB_exp2>不是JSON字符串时,则报错;
  3. 标量类型数据(非object或array)与标量类型数据的合并结果类型为array;
  4. 不支持标量类型数据与object类型数据进行合并;
  5. 标量类型数据与array类型数据的合并结果类型为array;
  6. object类型数据与array类型数据的合并结果类型为array;
  7. object类型数据与object类型数据的合并结果类型为object;
  8. array类型数据与array类型数据的合并结果类型为array。

举例说明

  1. 参数<JSONB_exp1>为NULL时,返回NULL。
SQL>  select jsonb_concat(null,'1');
 

行号   JSONB_CONCAT(NULL,'1')

---------- ----------------------

1     NULL
  1. 标量类型数据与标量类型数据的合并结果类型为array。
SQL>  select jsonb_concat('1','"abc"');
 

行号   JSONB_CONCAT('1','"abc"')

---------- -------------------------

1     [1,"abc"]
  1. 不支持标量类型数据与object类型数据进行合并。
SQL>   select jsonb_concat('1','{"b":2}');

[-3119]:JSONB对象的无效串接.
  1. jsonb_concat函数与jsonb_object_agg函数配合使用。
--jsonb_concat函数的结果作为jsonb_object_agg函数的参数

SQL>  select jsonb_object_agg('a',jsonb_concat('1', '2'));
 

行号   JSONB_OBJECT_AGG('a',JSONB_CONCAT('1','2'))

---------- -------------------------------------------

1     {"a":[1,2]}

 

--普通字符串作为jsonb_object_agg函数的参数

SQL>  select jsonb_object_agg('a','[1,2]');
 

行号   JSONB_OBJECT_AGG('a','[1,2]')

---------- -----------------------------

1     {"a":"[1,2]"}

可以看到,将jsonb_concat函数的结果作为jsonb_object_agg函数的<value>参数时,返回结果JSON对象OBJECT名称/值对中的“值”没有双引号。

18.2.11 to_jsonb

to_jsonb对JSON对象OBJECT名称/值对中的“名称”进行排序、去重。

语法格式

<to_jsonb函数> ::= to_jsonb(<JSON_exp1>)

参数

<JSON_exp1>:表示JSON的字符串,数据类型为VARCHAR或CLOB。

返回值

去重后的JSON字符串。返回值的数据类型与参数<JSON_exp1>的数据类型保持一致,数据类型为VARCHAR或CLOB。

使用说明

  1. 当参数<JSON_exp1>为NULL时,则返回NULL;
  2. 当参数<JSON_exp1>不是JSON字符串时,则报错;
  3. 去重时仅保留输入的最后一个OBJECT名称/值对;
  4. 递归对OBJECT名称/值对中的“名称”进行排序、去重。

举例说明

  1. 参数<JSON_exp1>为NULL时,返回NULL。
SQL>  select to_jsonb(null);
 

行号   TO_JSONB(NULL)

---------- --------------

1     NULL
  1. 对JSON对象OBJECT名称/值对中的“名称”进行排序、去重。
SQL>  select to_jsonb('{"b":1, "a":1, "a":3, "a":2}');
 

行号   TO_JSONB('{"b":1,"a":1,"a":3,"a":2}')

---------- -------------------------------------

1     {"a":2,"b":1}
  1. 递归对JSON对象OBJECT名称/值对中的“名称”进行排序、去重。
SQL>  select to_jsonb('{"b":{"a":1, "a":3}}');
 

行号   TO_JSONB('{"b":{"a":1,"a":3}}')

---------- -------------------------------

1     {"b":{"a":3}}
  1. to_jsonb不会对不同的OBJECT对象进行排序、去重。
SQL>  select to_jsonb('[{"b":1},{"a":1},{"a":2}]');
 

行号   TO_JSONB('[{"b":1},{"a":1},{"a":2}]')

---------- -------------------------------------

1     [{"b":1},{"a":1},{"a":2}]
  1. to_jsonb函数与jsonb_object_agg函数配合使用。
--to_jsonb函数的结果作为jsonb_object_agg函数的参数

SQL>  select jsonb_object_agg('b',to_jsonb('{"a":1, "a":3, "a":2}'));
  

行号   JSONB_OBJECT_AGG('b',TO_JSONB('{"a":1,"a":3,"a":2}'))

---------- -----------------------------------------------------

1     {"b":{"a":2}}

 

--普通字符串作为jsonb_object_agg函数的参数

SQL>  select jsonb_object_agg('b','{"a":2}');
 

行号   JSONB_OBJECT_AGG('b','{"a":2}')

---------- -------------------------------

1     {"b":"{\"a\":2}"}

可以看到,将to_jsonb函数的结果作为jsonb_object_agg函数的<value>参数时,返回结果JSON对象OBJECT名称/值对中的“值”没有双引号,并且也不会将其中的转义字符改写为“\”表示的转义字符。

18.2.12 json_table

JSON_TABLE的返回数据是表记录。

语法格式

<jsonb_table函数> ::=JSON_TABLE (<exp>),<json_path> [<on_error_clause>] COLUMNS (<column_clause>{,<column_clause>}))

<column_clause>::=<column_name> <datatype>  PATH <col_path>[<on_error_clause>]

<on_error_clause>::= <NULL ON ERROR>|

                     <ERROR ON ERROR>|

                     <DEFAULT <默认值表达式> ON ERROR>

参数

<exp>:表示JSON的字符串,数据类型为VARCHAR或CLOB。

<json_path>:字符串类型,表示所有列公共的json路径。

<col_path>:字符串类型,表示列独有路径,其结果基于json_path路径下的数据。

<on_error_clause>:按路径查找失败后的处理(置NULL值、报错、默认值),其中<默认值表达式>必须为字符串或者数值类型常量。

返回值

表记录。

使用说明

1.<exp>中json数据为NULL时,返回空结果集。

2.查询路径下数据失败,则根据<on_error_clause>选项,选择置NULL值、报错或者取默认值。

3.各个列值先需要进行json_path查询,随后进行col_path查询。

举例说明

例1,查询指定路径下的值。

SELECT * FROM JSON_TABLE('{a:100, b:200, c:{d:300, e:400}}', '$.c' COLUMNS(C1 NUMBER PATH '$.d', C2 NUMBER PATH '$.e'));

行号    C1 C2

---------- --- ---

1     300 400

其中,’​.c’是所有列共有的路径,而’.d’是C1列的路径,’$.e’是C2列的路径,两列的数据类型均为NUMBER类型。

例2,展示了on_error的作用,出错后使用on_error的值进行替换。

select * from json_table('{"b":"c"}','$' default 1 on error columns(c1 VARCHAR path '$' DEFAULT '2' ON ERROR, C2 INT PATH '$' NULL ON ERROR, c3 int path '$'));

行号    C1 C2     C3

---------- -- ----------- -----------

1     2 NULL    1

18.2.13 函数参数详解

18.2.13.1 路径表达式

JSON数据的查询需要使用路径表达式。路径表达式为通配符“*”和array范围。使用规则如下:

  1. object和array必须以“$”开始;
  2. object紧跟“.”,则表明对象是object,且需要指定<名称>;
  3. object紧跟通配符“*”,则表示object的所有<名称>;
  4. array紧跟“[”,以“]”结束,可以使用通配符“[*]”查找数组所有<值>;
  5. array索引可以是0, 1, 2,…,起始值为0;
  6. array中的范围必须非递减,例如:[3, 8 to 10, 12]、[1,2,3,3 to 3,3];
  7. 对于不是array的数据, $[0]表示本身;
  8. 路径最后一项为数组类型但对应的json非数组类型时,会创建新的数组,元素为原有json和加入的json。
SQL> select jsonb_set('{"ab":123}','$[0].ab[1]','[123]');

行号    JSONB_SET('{"ab":123}','$[0].ab[1]','[123]')

---------- --------------------------------------------

1     {"ab":[123,[123]]}

9. 路径同一层不能指定多个元素路径,不能使用通配符;

SQL> select jsonB_set('["abc"]','$.*','"abc"');

select jsonB_set('["abc"]','$.*','"abc"');

[-3113]:JSON 处理错误. 

SQL> select jsonB_set('["abc"]','$[1,2]','"a"');

select jsonB_set('["abc"]','$[1,2]','"a"');

例如:查询18.2.1 json_value节例子中数据Mobile值,使用的路径表达式为:$.ShippingInstructions.Phone[1].type。

18.2.13.2 PRETTY和ASCII

PRETTY以缩进的形式显示字符,ASCII以\uXXXX十六进制的形式显示非Unicode字符,使用原则如下:

  1. 默认为非PRETTY;
  2. 两者一起使用时,PRETTY必须在ASCII之前;
  3. json_value和json_query都可以使用ASCII;
  4. 只有json_query可以使用PRETTY。

举例说明:

  SQL>SET KEEPDATA ON

  --返回结果中的换行符不用空格替代

  SQL> SELECT json_query(po_document,'$.ShippingInstructions' RETURNING VARCHAR PRETTY WITH WRAPPER ERROR ON ERROR) from j_purchaseorder;

  json_query(PO_DOCUMENT,'$.ShippingInstructions'PRETTYWITHWRAPPERERROR

ONERROR)

---------- ------------------------------------------------------------

  [

	{

	  "name" : "Alexis Bull",

	  "Address" :

	  {

		"street" : "200 Sporting Green",

		"city" : "South San Francisco",

		"state" : "CA",

		"zipCode" : 99236,

		"country" : "United States of America"

	  },

	  "Phone" :

	  [

		{

		  "type" : "Office",

		  "number" : "909-555-7307"

		},

		{

		  "type" : "Mobile",

		  "number" : "415-555-1234"

		}

	  ]

	}

  ]

18.2.13.3 WRAPPER项

只有json_query可以使用<WRAPPER项>。缺省为WITHOUT WRAPPER。

  • WITH WRAPPER:以array的形式返回字符串,显示匹配路径表达式下的所有JSON 数据,array元素的顺序不是固定的。
  • WITHOUT WRAPPER:只返回匹配路径表达式的单个JSON object或array。如果是标量类型(非object或array)或多于1条数据则报错返回。
  • WITH CONDITIONAL WRAPPER:单个JSON object或array时,等价于WITHOUT WRAPPER;其他情况等价于WITH WRAPPER。
  • WITH UNCONDITIONAL WRAPPER和WITH WRAPPER是等价的。
  • ARRAY关键字可以省略,省略和不省略意义一样。
表 对比< WRAPPER项 >中不同组合情况
路径表达式 WITH WRAPPER WITHOUT WRAPPER WITH CONDITIONALWRAPPER
{"id": 38327} [{"id": 38327}] {"id": 38327} {"id": 38327}
[42, "a", true] [[42, "a", true]] [42, "a", true] [42, "a", true]
42 [42] Error [42]
42, "a", true [42, "a", true] Error [42, "a", true]
none [] Error []

举例说明

使用WITH WRAPPER关键字,以数组的形式返回查询结果。

  SELECT json_query(po_document, '$.ShippingInstructions.Phone[*].type' WITH WRAPPER) FROM j_purchaseorder;

  --返回结果:

  ["Office","Mobile"]

18.2.13.4 ERROR项

JSON函数和条件表达式的错误处理。只有路径表达式语法正确时,ERROR语句才有效。

  • ERROR ON ERROR:出错时则返回该错误;
  • NULL ON ERROR:出错时返回NULL;
  • EMPTY ON ERROR:出错时返回[],只有json_query可以用;
  • DEFAULT '<value>' ON ERROR:出错时返回指定的值,且<value>必须是常量,只有json_value可用。

举例说明

展示<ERROR项>的使用效果。

  SELECT JSON_VALUE('[1,2]','$[0,1]' ERROR ON ERROR) FROM DUAL;

  --报错:JSON_VALUE 求值为多个值

  SELECT JSON_VALUE('[[1]]','$[0]' ERROR ON ERROR) FROM DUAL;

  --报错:JSON_VALUE 的计算结果为非标量值

  SELECT JSON_VALUE('[1]','$[1]' RETURNING VARCHAR DEFAULT 1 ON ERROR) FROM DUAL;

  --报错: 默认值不匹配在 RETURNING 子句中定义的类型

  SELECT JSON_VALUE('[aa]','$[0]' RETURNING number default '1' on error) FROM DUAL;

------------------------------------------------------------------

  1

18.2.14 <JSON_expr1> ->> <expr2>

<JSON_expr1>->><expr2>以文本形式获取JSON数组元素或者JSON对象域。

语法格式

<JSON_expr1> ->> <expr2>

参数

<JSON_expr1>:表示JSON的字符串,数据类型为VARCHAR或CLOB。

<expr2>:表示JSON数组的索引号或JSON对象的名称。JSON数组元素索引从0开始,数据类型为数值类型(如:INT、BIGINT、NUMBER);JSON对象的“名称”为字符串,对应数据类型为VARCHAR。

返回值

返回JSON数组指定索引号的值,或者返回JSON对象指定名称的值。返回值数据类型与参数<JSON_expr1>的数据类型一致。

举例说明

  1. 查询数组指定索引号的值
SQL> SELECT '[1,2,3]'->>2;

行号    '[1,2,3]'->>2
---------- -------------
1     3
  1. 查询JSON对象指定名称的值
SQL> SELECT '{"a":[1,2,3],"b":2}'->>'a';

行号    '{"a":[1,2,3],"b":2}'->>'a'
---------- ---------------------------
1     [1,2,3]

18.2.15 <JSON_expr1> @> <JSON_expr2>

<JSON_expr1> @> <JSON_expr2>判断左边的JSON值是否包含右边的JSON路径或值项。

语法格式

<<JSON_expr1> @> <JSON_expr2>

参数

<JSON_expr1>:表示JSON的字符串,数据类型为VARCHAR或CLOB。

<JSON_expr2>:表示JSON的字符串,数据类型为VARCHAR或CLOB。

返回值

返回值为数值类型,1表示包含,0表示不包含。

举例说明

SQL> SELECT '{"a":1, "b":2}' @> '{"b":2}';

行号    '{"a":1,"b":2}'@>'{"b":2}'
---------- --------------------------
1     1

18.3 使用IS JSON/IS NOT JSON条件

IS JSON/IS NOT JSON条件,用于判断JSON数据合法性。当判断语法正确时,IS JSON返回true,IS NOT JSON返回false。

语法格式

  <IS_JSON_clause>::=

		IS [NOT] JSON [(STRICT|LAX)] [<unique_clause>]

  <unique_clause>::=

		WITH UNIQUE KEYS |

		WITHOUT UNIQUE KEYS

详细的参数介绍如下:

■ IS JSON/IS NOT JSON

通常,IS JSON/IS NOT JSON条件被用于CHECK约束中。当对JSON数据使用IS JSON/IS NOT JSON的CHECK约束时,在插入过程中会相对慢一些。当能够保证JSON数据的合法性时,可以DISABLE这个约束,建议不要DROP该约束。

举例说明

1.在CHECK中使用IS JSON,保证插入的数据,符合JSON标准。

  drop table json_is_json cascade;

  CREATE TABLE json_is_json

  (id int NOT NULL,

  po_document CLOB

  CONSTRAINT ensure_json_unique CHECK (po_document IS JSON));

  --创建成功

  INSERT INTO json_is_json VALUES (1,'{"PONumber" : 1600, "PONumber" : 1800}');

  --插入成功

  INSERT INTO json_is_json VALUES (2,'OK');		--不是JSON数据,报错违反CHECK约束

  INSERT INTO json_is_json VALUES (3,NULL);		--IS JSON可以成功插入NULL,IS NOT JSON时也可以成功插入NULL。

2.在插入语句中使用IS JSON,保证从其他表中拷入的数据,是符合JSON标准的。

  drop table j_purchaseorder_insert;

  --第一步:创建表

  CREATE TABLE j_purchaseorder_insert

  (c1int NOT NULL,

  c2 TIMESTAMP (6) WITH TIME ZONE,

  c3 VARCHAR);

  --第二步:插入数据

  INSERT INTO j_purchaseorder_insert select id, date_loaded, po_document from j_purchaseorder where po_document IS JSON;

LAX/STRICT

LAX/STRICT用来规范JSON数据格式。STRICT数据格式比LAX要求更严格。默认是LAX。详细规则如下:

1.STRICT和LAX时,true/false/null大小写要求不同,详情请参考true/false、null章节。

2.IS JSON(STRICT)时,正数不能以“+”或“.”开头,不能有前导0,不能以“.”结尾;LAX时则可以。

3.IS JSON(STRICT)时,object的string:value链表或array的value链表后不能多追加“,”;IS JSON(LAX)时则可以。

4.JSON函数不区分STRICT和LAX。

举例说明

将同一组数据插入到分别使用了LAX/STRICT的表中,对比区别。

第一步,在表t_json_s中使用IS JOSN (STRICT),表t_json_l中使用IS JOSN (LAX)。

  drop table t_json_s;

  drop table t_json_l;

  create table t_json_s(c1 int, c2 varchar2(100) constraint c2_json CHECK (c2 is json (strict)));

  create table t_json_l(c1 int, c2 varchar2(100) constraint l_c2_json CHECK (c2 is json (lax)));

第二步,分别插入上述数据。

  insert into t_json_l values(1,'{''dmdatabase'':29}');			--<名称>:没有使用双引号

  insert into t_json_l values(2,'{"2dmdatabase":29}');			-- 正确

  insert into t_json_l values(3,'{"dmdatabase":.29}');			-- <值>:缺失整数部分

  insert into t_json_l values(4,'{"dmdatabase":NULL}');			-- <值>:NULL没有小写

  insert into t_json_l values(5,'{"dmdatabase":False}');		-- <值>:False没有小写

  insert into t_json_l values(6,'{"dmdatabase":29,"dmdatabase":30}'); -- 正确

  insert into t_json_l values(7,'{"dm data base":29}');			-- 正确

  insert into t_json_l values(8,'{"dmdatabase":dmdatabase}');	--<值>:字符串缺双引号

  insert into t_json_l values(9,'{dmdatabase: "dmdatabase"}');	--<值>:字符串前有空格

  insert into t_json_l values(10,'{"dmdatabase":2s}');			-- <值>:字符串没有加双引号

  insert into t_json_l values(11,'{"dmdatabase":''2s''}');		-- <值>:字符串缺双引号

  insert into t_json_l values(12,'{dmdatabase:29 }');			-- <值>:数字后有空格

第三步,查询两个表中数据,对比插入结果。

  SQL> select * from t_json_l order by c1;

  行号	C1		C2

---------- ----------- ---------------------------------

  1		1		{'dmdatabase':29}

  2		2		{"2dmdatabase":29}

  3		3		{"dmdatabase":.29}

  4		4		{"dmdatabase":NULL}

  5		5		{"dmdatabase":False}

  6		6		{"dmdatabase":29,"dmdatabase":30}

  7		7		{"dm data base":29}

  8		9		{dmdatabase: "dmdatabase"}

  9		11		{"dmdatabase":'2s'}

  10	12		{dmdatabase:29 }

  10 rows got

  --返回结果:只有第8行和第10行插入失败。

  SQL> select * from t_json_s order by c1;

  行号	C1		C2

---------- ----------- ---------------------------------

  1		2		{"2dmdatabase":29}

  2		6		{"dmdatabase":29,"dmdatabase":30}

  3		7		{"dm data base":29}

  --只有第2、6、7行插入成功。其他没有插入成功的。插入时均报错:违反CHECK约束。

with unique keys/ without unique keys

与IS JOSN一起使用;

使用WITH UNIQUE时,对象中不可以有同名的名称,即名称必须唯一;

使用WITHOUT UNIQUE时,对象中可以有同名的名称,但是查询时只会随机选择其中一个,DM默认选择第一个。

缺省为使用WITHOUT UNIQUE。

举例说明

在CHECK约束中使用IS JOSN WITH UNIQUE KEYS,保证插入的数据没有重复。

  DROP TABLE json_unique CASCADE;

  CREATE TABLE json_unique

  (id int NOT NULL,

  date_loaded TIMESTAMP (6) WITH TIME ZONE,

  po_document CLOB

  CONSTRAINT ensure_json_unique CHECK (po_document IS JSON with unique keys));

  --创建成功

  INSERT INTO json_unique VALUES (

  111,SYSTIMESTAMP,'{"PONumber" : 1600, "PONumber" : 1800}');

  --报错:违反CHECK约束条件 (ENSURE_JSON_UNIQUE)

18.4 视图

JSON数据信息都存储在DBA_JSON_COLUMNS、USER_JSON_COLUMNS和ALL_JSON_COLUMNS视图中,下面进行详细介绍。

18.4.1 视图使用说明

  1. 当JSON列的IS JSON约束被失效后,该列仍然在视图中显示。
  2. 当IS JSON涉及多列时,则所有涉及的列均在视图中显示。例如:c1||c2 is json,则c1和c2列均在视图中显示。
  3. 如果IS JSON与其他约束进行”与”(AND)运算时,则所有涉及的列均在视图中显示。例如:c1 = '1' and c2 is json
  4. 如果IS JSON与其他约束进行”或”(OR)运算时,则所有列均不在视图中显示。例如:c1 is json OR c2 < 1000,即使是c1 is json OR c2 is json也不行。
  5. 如果IS NOT JSON作为CHECK约束时,则该列不在视图中显示。例如:C1 is not json。同理:c1||c2 is not json,则c1和c2均不能在下列视图中显示。
  6. 如果NOT IS JSON作为CHECK约束时,则该列也不能在下列视图中显示。例如:not( c2 is json )
  7. 当虚拟列相关的实际列使用IS JSON作为CHECK约束时,该虚拟列不在视图中显示;当虚拟列使用IS JSON作为CHECK约束时,仅该虚拟列在视图中显示,实际列则不在视图中显示。

18.4.2 DBA_JSON_COLUMNS

显示数据库中所有的JSON数据信息。

列名 数据类型 说明
OWNER VARCHAR(128) 模式名
TABLE_NAME VARCHAR(128) 表名
COLUMN_NAME VARCHAR(128) 列名
FORMAT VARCHAR(4) 格式化。统一为TEXT
DATA_TYPE VARCHAR(11) 列的数据类型。可能的取值:VARCHAR2、CLOB、LONGVARCHAR、TEXT、UNDEFINED(对于CHAR类型、VARCHAR类型)

18.4.3 USER_JSON_COLUMNS

显示当前用户所拥有的JSON数据信息。该视图比DBA_JSON_COLUMNS视图少了一列OWNER。

18.4.4 ALL_JSON_COLUMNS

显示当前用户有权访问的JSON数据信息。该视图列与DBA_JSON_COLUMNS完全相同。

18.5 一个简单的例子

在数据库表中插入JSON数据,并查询它。

第一步,在CHECK中使用IS JSON,保证插入的数据符合JSON标准格式。

  drop table j_purchaseorder;

  --创建表

  CREATE TABLE j_purchaseorder

  (id int NOT NULL,

  date_loaded TIMESTAMP (6) WITH TIME ZONE,

  po_document VARCHAR

  CONSTRAINT ensure_json CHECK (po_document IS JSON));

  --插入数据。插入po_document列的就是JSON数据,也可以使用dmfldr工具导入数据。

  INSERT INTO j_purchaseorder VALUES (1,SYSTIMESTAMP,'{

  "PONumber" : 1600,

  "Reference" : "ABULL-20140421",

  "Requestor" : "Alexis Bull",

  "User" : "ABULL",

  "CostCenter" : "A50",

  "ShippingInstructions" : {"name" : "Alexis Bull",

		"Address": {"street" : "200 Sporting Green",

		"city" : "South San Francisco",

		"state" : "CA",

		"zipCode" : 99236,

		"country" : "United States of America"},

		"Phone" : [{"type" : "Office", "number" : "909-555-7307"},

					{"type" : "Mobile", "number" : "415-555-1234"}]

		},

  "Special Instructions" : null,

  "AllowPartialShipment" : true,

  "LineItems" : [{"ItemNumber" : 1,

					"Part" : {"Description" : "One Magic Christmas",

								"UnitPrice" : 19.95,

								"UPCCode" : 13131092899},

					"Quantity" : 9.0},

				{"ItemNumber" : 2,

				"Part" : {"Description" : "Lethal Weapon",

						"UnitPrice" : 19.95,

						"UPCCode" : 85391628927},

				"Quantity" : 5.0}]

  }

  ');

查询结果:

  SQL> SELECT json_query(po_document,'$.*' RETURNING VARCHAR PRETTY WITH WRAPPER ERROR ON ERROR) from j_purchaseorder;

  行号	json_query(PO_DOCUMENT,'$.*'PRETTYWITHWRAPPERERRORONERROR)

------------------------------------------------------------------------

  1			[

		1600,

		"ABULL-20140421",

		"Alexis Bull",

		"ABULL",

		"A50",

		{

		  "name" : "Alexis Bull",

		  "Address" :

		  {

			"street" : "200 Sporting Green",

			"city" : "South San Francisco",

			"state" : "CA",

			"zipCode" : 99236,

			"country" : "United States of America"

		  },

		  "Phone" :

		  [

			{

			  "type" : "Office",

			  "number" : "909-555-7307"

			},

			{

			  "type" : "Mobile",

			  "number" : "415-555-1234"

			}

		  ]

		},

	  null,

	  true,

		[

		  {

			"ItemNumber" : 1,

			"Part" :

			{

			  "Description" : "One Magic Christmas",

			  "UnitPrice" : 19.95,

			  "UPCCode" : 13131092899

			},

			"Quantity" : 9.0

		  },

		  {

			"ItemNumber" : 2,

			"Part" :

			{

			  "Description" : "Lethal Weapon",

			  "UnitPrice" : 19.95,

			  "UPCCode" : 85391628927

			},

			"Quantity" : 5.0

		  }

		]

	  ]
微信扫码
分享文档
扫一扫
联系客服