以此为例:

SELECT json_object(
    'a' value 'blah',
    'b' value 'blah',
    'c' value 'blah'
    FORMAT JSON)
FROM dual

输出为:

{"a":"blah","b":"blah","c":blah}

最后一句废话没有用引号引起来.

这是个漏洞,还是我漏掉了什么?

我正在使用:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.17.0.0.0

EDIT:

让这件事更神秘的是:

SELECT json_object(
    'a' value 1,
    'b' value 2,
    'c' value 'blah'
    FORMAT JSON)
FROM dual

给了我:

{"a":1,"b":2,"c":blah}

但是:

SELECT json_object(
    'a' value 1,
    'b' value 2,
    'c' value 3
    FORMAT JSON)
FROM dual

给了我:

Error starting at line : 1 in command -
SELECT json_object(
    'a' value 1,
    'b' value 2,
    'c' value 3
    FORMAT JSON)
FROM dual
Error at Command Line : 4 Column : 15
Error report -
SQL Error: ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:

推荐答案

JSON_OBJECT documentation人开始:

FORMAT_子句

在输入表达式后指定FORMAT JSON,以声明由此产生的值表示JSON数据,因此不会在输出中引用.

当您使用FORMAT JSON时,Oracle期望提供的值是有效的JSON,并将输出提供的值,而不对其应用任何格式.因此,如果它是一个字符串文字,那么您需要提供周围的引号作为输入值的一部分,以便在您使用FORMAT JSON选项时它是有效的JSON.

SELECT json_object(
         'a' value 'blah' FORMAT JSON,
         'b' value 'blah' FORMAT JSON,
         'c' value 'blah' FORMAT JSON
       ) AS formatted_values
FROM   DUAL

输出:

FORMATTED_VALUES
{"a":blah,"b":blah,"c":blah}

以及:

SELECT json_object(
         'a' value 'blah',
         'b' value 'blah',
         'c' value 'blah' FORMAT JSON
       ) AS formatted_values
FROM   DUAL

输出:

FORMATTED_VALUES
{"a":"blah","b":"blah","c":blah}

如果希望Oracle将字符串引起来,则不要使用FORMAT JSON:

SELECT json_object(
         'a' value 'blah',
         'b' value 'blah',
         'c' value 'blah'
       ) AS formatted_values
FROM   DUAL

输出:

FORMATTED_VALUES
{"a":"blah","b":"blah","c":"blah"}

如果您确实想使用FORMAT JSON,则通过提供引号确保输出值是有效的JSON:

SELECT json_object(
         'a' value '"blah"' FORMAT JSON,
         'b' value '"blah"' FORMAT JSON,
         'c' value '"blah"' FORMAT JSON
       ) AS formatted_values
FROM   DUAL
FORMATTED_VALUES
{"a":"blah","b":"blah","c":"blah"}

fiddle


这一行为也在documentation for the 严格 keyword条中提到:

严格

指定严格子句以验证JSON生成函数的输出是正确的JSON.如果判断失败,则会引发语法错误.

Example 2: No quotes around output string when FORMAT JSON is used.

SELECT JSON_OBJECT ('name' value 'Foo' FORMAT JSON ) FROM DUAL

输出:

JSON_OBJECT('NAME'VALUE'FOO'FORMATJSON)
{"name":Foo}

Json相关问答推荐

Vega Lite中的图例对齐

写入JSON文件的流

当有2个嵌套数组时展平复杂的JSON

如何在我的响应模型中修复此问题:[期望的值类型为';Map<;Dynamic,Dynamic&>;,但获得的值类型为';NULL&39;]

如何将文件夹组织的.json文件合并为一个JSON文件,文件夹/文件名作为键

有没有办法让serde_json正确/不正确地处理NaN、inf和-inf(IEEE 754特殊标准)?

使用JQ合并JSON列表中的对象

无法访问id的第三级json

JOLT转换以基于对象属性过滤JSON数组

将不带正文的 CURL POST 转换为 RESTRequest Delphi 代码 / 为 Dropbox API /get_current_account 端点编写 Delphi 代码

jq :遍历 json 并在键存在时检索集合

JSON 的自定义编组器,可以是字符串或 map[string]string / map[string]bool

在 CodePipeline 中调用 lambda 时传递用户参数

如何从 JSON 中获取数据并通过 vb6 在网格中显示

如何将 LinkedHashMap 转换为自定义 java 对象?

字符串的 Gson 数组到 JsonArray

[__NSCFNumber 长度]:发送到实例 UITableView 的无法识别的 Select 器

在 React 中访问子级的父级状态

有没有办法在 angular.json 中扩展配置?

使用 jQuery 和 JSON 填充表单?