#JSON_SERIALIZE
JSON_SERIALIZE
函数将二进制json数据按照pretty格式或compact格式序列化为字符串,且序列化后的字符串长度不超过 returning_clause
定义的限制值。
json_value
为一个二进制json数据,可通过JSON函数获取,当其值为NULL时,函数返回NULL。
JSON_SERIALIZE
函数存在别名,为 JSON_FORMAT
,其功能与 JSON_SERIALIZE
完全相同。
returning_clause
该子句用于限制输出字符串的长度,可省略,则系统默认输出字符串的长度为32000。
size为一个整形常量,取值范围为[0,32000]。
当实际字符串长度超过size限制值时,函数返回错误。
PRETTY
PRETTY用于指定字符串的打印规则为pretty,不指定PRETTY时,系统默认按compact规则打印字符串。
compact即紧凑型打印规格,此规则在打印字符串时将去掉所有的规格化空格与换行。
pretty规则具体为:
1.对于JSON Array类型的数据:
- Number、String、Bool、Null类型的数组元素出现在单独的行上。
- Object或者Array类型的数组元素占多行。
[
和]
各占一行,位于同一个级别,所有数组元素位于同一级别,与[
和]
相比,缩进了一个额外的级别,每一级别缩进为两个空格。- 在两个数组元素的换行符前,会添加一个逗号来分割数组元素。
- 空数组仍然需要换行。
2.对于JSON Object类型的数据:
- 如果对象成员中的Value是Number、String、Bool、Null类型,key和value打印在同一行。
- 如果对象成员中的Value是Object、Array类型,key和value不在同一行输出。
{
和}
各占一行,位于同一个级别,所有对象成员位于同一级别,与{
和}
相比,缩进了一个额外的级别,每一级别缩进为两个空格。- 对象成员的key和value之间用"空格 冒号 空格"分割;
- 在两个对象成员的换行符前,会添加一个逗号来分割对象成员。
- 空对象仍然需要换行。
3.对于JSON String类型的数据:
- 无论是Object中的key还是String类型的标量值,打印时都会在前后使用双引号。
- 字符串本身中的'\b (backspace)'、'\f (form feed)'、'\n (newline, line feed)'、'\r (carriage return)'、'\t (tab, horizontal tab)'、'Double quotation mark (")'、'slash (/)'、'backslash (\)'需要被转义打印;
4.对于JSON Number类型的数据:
number的指数大于等于0时,如果展开打印后的宽度大于40,则使用科学计数法打印,否则展开打印。例如:
- 1e39打印结果为:1000000000000000000000000000000000000000
- 1e40打印结果为:1E+40
number的指数小于0时,如果展开打印后的小数部分(去掉小数部分后面的0)的宽度大于40,则使用科学计数法打印,否则展开打印。例如:
- 12300e-43打印结果为:1.23E-39(展开打印结果为0.00000000000000000000000000000000000000123,小数点后面41位,故使用科学计数法打印)
- 12300e-42打印结果为:0.0000000000000000000000000000000000000123(小数点后面正好40位)
EXTENDED
EXTENDED关键字用于设置使用扩展模式输出JSON数据,详见JSON扩展格式输出。
示例
SELECT JSON_SERIALIZE(JSON('{"keyC":123, "keyabc":false, "keyA":234, "keyB":345, "key":true}') PRETTY) res FROM DUAL;
RES
----------------------------------------------------------------
{
"key" : true,
"keyA" : 234,
"keyB" : 345,
"keyC" : 123,
"keyabc" : false
}
SELECT JSON_SERIALIZE(JSON('{"keyC":123, "keyabc":false, "keyA":234, "keyB":345, "key":true}')) res FROM DUAL;
RES
----------------------------------------------------------------
{"key":true,"keyA":234,"keyB":345,"keyC":123,"keyabc":false}
SELECT JSON_SERIALIZE(JSON('{"keyC":123, "keyabc":false, "keyA":234, "keyB":345, "key":true}') RETURNING VARCHAR(10) PRETTY) res FROM DUAL;
YAS-00215 length of concat texts exceeds the buffer limit
-- JSON扩展模式的输入输出
SELECT JSON_SERIALIZE(JSON('{"$binary": "SGVsbG8gd29ybGQh"}' EXTENDED)) res FROM DUAL ;
RES
----------------------------------------------------------------
"48656C6C6F20776F726C6421"
SELECT JSON_SERIALIZE(JSON('{"$binary": "SGVsbG8gd29ybGQh"}' EXTENDED) EXTENDED) res FROM DUAL ;
RES
----------------------------------------------------------------
{"$binary": "SGVsbG8gd29ybGQh"}
-- JSON扩展模式输出同样受到PRETTY关键字影响
SELECT JSON_SERIALIZE(JSON('{"$binary": "SGVsbG8gd29ybGQh"}' EXTENDED) PRETTY EXTENDED) res FROM DUAL ;
RES
----------------------------------------------------------------
{
"$binary": "SGVsbG8gd29ybGQh"
}