如何将空字符串放入 JSON_OBJECT_T 对象中?

How to put empty string in JSON_OBJECT_T object?

我正在尝试使用以下代码将空字符串添加到 JSON_OBJECT_T,但我得到的值是 null 而不是空字符串。

DECLARE
   V_OBJ JSON_OBJECT_T;
BEGIN
   V_OBJ := JSON_OBJECT_T();
   V_OBJ.PUT('customerAccRef','');
   DBMS_OUTPUT.PUT_LINE(V_OBJ.stringify);
END;

当我这样做时,我得到以下 json

{"customerAccRef":null}

我想要如下输出

{"customerAccRef":""}

有人可以建议我需要做哪些更改才能传递空字符串吗?

发生这种情况的原因是 Oracle 在内部将空字符串更改为 NULL 值。这是由于一些遗留原因,您可以阅读 this answer 了解历史。

我在 JSON 文档中找不到任何可以自己绕过这个特定问题的选项,但如果有人能找到它我会很高兴。

作为您问题的解决方法,您可以使用 TRIM 函数将单个 space 转换为空白字符串。

V_OBJ.PUT('customerAccRef' , TRIM(' '));

这给出了

{"customerAccRef":""}

这似乎在 Oracle 12.2 版本中都有效;我在本地机器和 Oracle 中进行了测试 18c : DEMO, as well as in 19c (LiveSQL online)

这里还要注意的一点是,一个简单的 select TRIM(' ') from dual 总是 returns NULL,这对你来说是令人惊讶和幸运的,它与 JSON 一起按预期工作小号

在 19c 中,使用 put(..., '') 你会得到一个空字符串。 使用 put_nullput(..., to_char(null))put(..., <unitializedString>) 你会得到“真正的”空值。

DECLARE
   V_OBJ JSON_OBJECT_T;
   V_STRING VARCHAR2(20);
BEGIN
   V_OBJ := JSON_OBJECT_T();
   V_OBJ.PUT('doubleSingleQuotes','');
   V_OBJ.PUT('toCharNull',to_char(null));
   V_OBJ.PUT('uninitializedStringVariable',v_string);
   V_OBJ.PUT_null('null');
   V_OBJ.PUT('trimSpace', trim(' '));
   DBMS_OUTPUT.PUT_LINE(V_OBJ.stringify);
END;

... 给出:

{"doubleSingleQuotes":"","toCharNull":null,"uninitializedStringVariable":null,"null":null,"trimSpace":""}