类别:

转换函数半结构化和结构化数据函数 (类型转换)

TO_JSON

VARIANT 值转换为包含该值的 JSON 表示形式的字符串。

语法

TO_JSON( <expr> )
Copy

实参

expr

保存有效 JSON 信息的 VARIANT 类型的表达式。

返回

返回类型 VARCHAR 的值。

如果输入为 NULL,则该函数返回 NULL。

使用说明

  • 如果输入为 NULL,则输出也是 NULL。如果输入是包含 JSON null 的 VARIANT,则返回值是字符串 "null" (即放在双引号内的单词“null”)。请参阅以下示例。

  • JSON 对象(也称为“字典”或“哈希”)是一组 无序 的键值对。TO_JSON 生成字符串时,该字符串中键值对的顺序是不可预测的。

  • TO_JSON 和 PARSE_JSON(几乎)是相反或互逆的函数。

    • PARSE_JSON 函数接受一个字符串作为输入,并返回一个 JSON 兼容的 VARIANT

    • TO_JSON 函数接受一个 JSON 兼容的 VARIANT 并返回一个字符串。

    如果 X 是包含有效 JSON 的字符串,则以下内容(从概念上讲)为真:

    X = TO_JSON(PARSE_JSON(X));

    例如,以下情况(从概念上讲)为真:

    '{"pi":3.14,"e":2.71}' = TO_JSON(PARSE_JSON('{"pi":3.14,"e":2.71}'))

    但是,这些函数并不完全互逆,因为:

    • 空字符串和只有空格的字符串不会互逆。例如,PARSE_JSON('') 的返回值为 NULL,但 TO_JSON(NULL) 的返回值为 NULL,而不是倒数 ''

    • TO_JSON 生成的字符串中键值对的顺序是不可预测的。

    • TO_JSON 生成的字符串可以比传递给 PARSE_JSON 的字符串具有更少的空格。

    例如,以下是等效的 JSON,但不是等效的字符串:

    • {"pi": 3.14, "e": 2.71}

    • {"e":2.71,"pi":3.14}

示例

以下示例使用 TO_JSON 函数。

插入 VARIANT 值并使用查询将其转换为字符串

创建并填写表。该 INSERT 语句使用该 PARSE_JSON 函数在表的 v 列中插入一个 VARIANT 值。

CREATE OR REPLACE TABLE jdemo1 (v VARIANT);
INSERT INTO jdemo1 SELECT PARSE_JSON('{"food":"bard"}');
Copy

查询数据并使用该 TO_JSON 函数将 VARIANT 值转换为字符串。

SELECT v, v:food, TO_JSON(v) FROM jdemo1;
Copy
+------------------+--------+-----------------+
| V                | V:FOOD | TO_JSON(V)      |
|------------------+--------+-----------------|
| {                | "bard" | {"food":"bard"} |
|   "food": "bard" |        |                 |
| }                |        |                 |
+------------------+--------+-----------------+

使用 PARSE_JSON 和 TO_JSON 函数处理 NULL 值

以下示例显示了 PARSE_JSON 和 TO_JSON 如何处理 NULL 值:

SELECT TO_JSON(NULL), TO_JSON('null'::VARIANT),
       PARSE_JSON(NULL), PARSE_JSON('null');
Copy
+---------------+--------------------------+------------------+--------------------+
| TO_JSON(NULL) | TO_JSON('NULL'::VARIANT) | PARSE_JSON(NULL) | PARSE_JSON('NULL') |
|---------------+--------------------------+------------------+--------------------|
| NULL          | "null"                   | NULL             | null               |
+---------------+--------------------------+------------------+--------------------+

比较 PARSE_JSON 和 TO_JSON

以下示例演示了 PARSE_JSON 和 TO_JSON 函数之间的关系。

此示例创建了一个具有 VARCHAR 列和 VARIANT 列的表。INSERT 语句插入一个 VARCHAR 值,且 UPDATE 语句生成一个与该 VARCHAR 值对应的 JSON 值。

CREATE OR REPLACE TABLE jdemo2 (
  varchar1 VARCHAR, 
  variant1 VARIANT);

INSERT INTO jdemo2 (varchar1) VALUES ('{"PI":3.14}');

UPDATE jdemo2 SET variant1 = PARSE_JSON(varchar1);
Copy

该查询表明 TO_JSON 和 PARSE_JSON 在概念上是互逆函数:

SELECT varchar1, 
       PARSE_JSON(varchar1), 
       variant1, 
       TO_JSON(variant1),
       PARSE_JSON(varchar1) = variant1, 
       TO_JSON(variant1) = varchar1
  FROM jdemo2;
Copy
+-------------+----------------------+--------------+-------------------+---------------------------------+------------------------------+
| VARCHAR1    | PARSE_JSON(VARCHAR1) | VARIANT1     | TO_JSON(VARIANT1) | PARSE_JSON(VARCHAR1) = VARIANT1 | TO_JSON(VARIANT1) = VARCHAR1 |
|-------------+----------------------+--------------+-------------------+---------------------------------+------------------------------|
| {"PI":3.14} | {                    | {            | {"PI":3.14}       | True                            | True                         |
|             |   "PI": 3.14         |   "PI": 3.14 |                   |                                 |                              |
|             | }                    | }            |                   |                                 |                              |
+-------------+----------------------+--------------+-------------------+---------------------------------+------------------------------+

但是,这些函数并不完全是互逆的。键值对的空格或顺序差异可能会阻止输出与输入匹配。例如:

SELECT TO_JSON(PARSE_JSON('{"b":1,"a":2}')),
       TO_JSON(PARSE_JSON('{"b":1,"a":2}')) = '{"b":1,"a":2}',
       TO_JSON(PARSE_JSON('{"b":1,"a":2}')) = '{"a":2,"b":1}';
Copy
+--------------------------------------+--------------------------------------------------------+--------------------------------------------------------+
| TO_JSON(PARSE_JSON('{"B":1,"A":2}')) | TO_JSON(PARSE_JSON('{"B":1,"A":2}')) = '{"B":1,"A":2}' | TO_JSON(PARSE_JSON('{"B":1,"A":2}')) = '{"A":2,"B":1}' |
|--------------------------------------+--------------------------------------------------------+--------------------------------------------------------|
| {"a":2,"b":1}                        | False                                                  | True                                                   |
+--------------------------------------+--------------------------------------------------------+--------------------------------------------------------+
语言: 中文