如何使用 JSON_TABLE 访问 json 中的数字对象或标签名称?

问题描述 投票:0回答:1

我有以下 JSON,它作为程序中的参数出现。我想从 JSON 访问discountid 和discountname 属性。由于 243431 是数字标签,我无法访问其中的任何属性。

"discountDetail": {
  "243431": {
    "discountId": "243431",
    "discountName": "Standard Service Discount - USD",
    "discountDescription": "Standard - Standard Service Discount - USD",
    "discountGroup": "Standard",
    "modifierLineTypeCode": "DIS"
  }
}
CREATE OR REPLACE PROCEDURE parse_json (p_json CLOB)
IS
BEGIN
    for i in (SELECT *
             FROM JSON_TABLE (
                      p_json FORMAT JSON,'$'
                      COLUMNS (
                          NESTED PATH '$.responseHeader.discountDetail.243431[*]'
                              COLUMNS (discountId VARCHAR2 PATH '$.discountId',
                                       discountName VARCHAR2 PATH '$.discountName') loop
        DBMS_OUTPUT.put_line ('discountId=' || i.discountId);
        DBMS_OUTPUT.put_line ('discountName=' || i.discountName);
    end loop;
END;

访问 243431 标签时出现以下错误

[Error] Compilation (70: 15): PL/SQL: ORA-40597: JSON path expression syntax error ('$.responseHeader.discountDetail.243431[*]')
JZN-00209: Unexpected characters after end of path
at position 38

有什么替代方案吗?

json oracle plsql
1个回答
0
投票

在标识符周围使用双引号(并且不要忘记右括号

)
):

CREATE OR REPLACE PROCEDURE parse_json (p_json CLOB)
IS
BEGIN
    for i in (SELECT *
             FROM JSON_TABLE (
                      p_json FORMAT JSON,'$'
                      COLUMNS (
                          NESTED PATH '$.responseHeader.discountDetail."243431"[*]'
                              COLUMNS (discountId VARCHAR2 PATH '$.discountId',
                                       discountName VARCHAR2 PATH '$.discountName'
                                      )
                     )
                  )
    )
    loop
        DBMS_OUTPUT.put_line ('discountId=' || i.discountId);
        DBMS_OUTPUT.put_line ('discountName=' || i.discountName);
    end loop;
END;
/

然后:

BEGIN
  DBMS_OUTPUT.ENABLE();
  parse_json('{"responseHeader":{"discountDetail": {
  "243431": {
    "discountId": "243431",
    "discountName": "Standard Service Discount - USD",
    "discountDescription": "Standard - Standard Service Discount - USD",
    "discountGroup": "Standard",
    "modifierLineTypeCode": "DIS"
  }
}}}');
END;
/

输出:

discountId=243431
discountName=Standard Service Discount - USD

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.