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

Posted

技术标签:

【中文标题】如何将空字符串放入 JSON_OBJECT_T 对象?【英文标题】:How to put empty string in JSON_OBJECT_T object? 【发布时间】:2019-04-04 12:37:21 【问题描述】:

我正在尝试使用以下代码向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":""

有人可以建议我需要做什么更改才能传递一个空字符串吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

给了

"customerAccRef":""

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

这里还需要注意一点,一个简单的select TRIM(' ') from dual 总是返回NULL,这对你来说是令人惊讶和幸运的,它可以与 JSON 一样工作

【讨论】:

谢谢,我也有同样的想法,但正在检查是否可以不调用任何函数?另外你对我的另一篇文章有​​什么建议吗? ***.com/questions/54644055/… @KinjanBhavsar:对不起。我认为我永远无法回答 Chris Saxon 无法回答的 Oracle JSON 相关问题(或任何 SQL)(他也没有回答)在您在问题中添加详细信息之后)。您可能会提出一个新问题,将前一个问题与所需的详细信息联系起来,他或其他人可能会帮助您。关于这个特定问题,您是否要等待其他答案(可能是 Chris 本人可以,不使用 TRIM)或继续此问题,由您决定。 我使用了您提供的解决方法,并且工作正常。谢谢 另外,如果您可以为***.com/questions/55535454/… 提出任何建议,那将是一个很大的帮助。【参考方案2】:

在 19c 中,使用 put(..., '') 会得到一个空字符串。 使用put_null,或put(..., 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":""

【讨论】:

以上是关于如何将空字符串放入 JSON_OBJECT_T 对象?的主要内容,如果未能解决你的问题,请参考以下文章

C ++的“map”容器是否对字符串的连续子串应用Rabin-Karp算法?

从 JSON 中提取很长的字符串到 CLOB

ORA-30625 - JSON_OBJECT_T

Freemarker - 将变量名设置和获取为空字符串

不在B中的A的子串数量 HDU - 4416 (后缀自动机模板题目)

如何判断 Tasker 变量是未设置、空字符串还是非空字符串