首页 > 解决方案 > ORACLE json_object_t - 在方法链获取的对象上调用 get_string() 方法时出错 .get_array() .get()

问题描述

我试图通过 JSON_OBJECT_T 类型的方法链从 JSON 对象中包含的数组中获取一个值 - .get_array(...).get(0).get_string(...)

但得到一个例外component 'GET_STRING' must be declared

这是我的代码,有人可以解释为什么链条不起作用吗?

declare
    l_data clob := '{
        "data": {
            "foo": "bar",
            "persons": [{"code":100, "name":"Elon"}, {"code":200, "name":"Musk"}]
        }
    }';
    --
    function bool_to_char(val in boolean) return varchar2 is
    begin
        return case val when true then 'TRUE' else 'FALSE' end;
    end;
begin
    dbms_output.put_line(
        bool_to_char(
            json_object_t
                .parse(l_data)
                .get_object('data')
                .get_array('persons')
                .get(0)
                .is_object
        )
    );  -- TRUE - got object

    -- this code works - got "Elon"
    dbms_output.put_line(
        json_object_t
            .parse(
                json_object_t
                    .parse(l_data)
                    .get_object('data')
                    .get_array('persons')
                    .get(0)
                    .stringify
            )
            .get_string('name')
    );

    -- this code does not work - got exception "PLS-00302: component 'GET_STRING' must be declared"
    /*
    dbms_output.put_line(
        json_object_t
            .parse(l_data)
            .get_object('data')
            .get_array('persons')
            .get(0)
            .get_string('name')
    );
    */
end;

标签: sqloracleplsql

解决方案


问题是调用.get(0)返回类型JSON_ELEMENT_T,而不是JSON_OBJECT_T类型。JSON_ELEMENT_T没有GET_STRING方法,这就是您收到错误的原因。

使用后get(0),可以TREAT将返回值作为a JSON_OBJECT_T,以便调用GET_STRING方法。

请参阅下面的代码

DECLARE
    l_data   CLOB := '{
        "data": {
            "foo": "bar",
            "persons": [{"code":100, "name":"Elon"}, {"code":200, "name":"Musk"}]
        }
    }';

    --
    FUNCTION bool_to_char (val IN BOOLEAN)
        RETURN VARCHAR2
    IS
    BEGIN
        RETURN CASE val WHEN TRUE THEN 'TRUE' ELSE 'FALSE' END;
    END;
BEGIN
    DBMS_OUTPUT.put_line (
        bool_to_char (
            json_object_t.parse (l_data).get_object ('data').get_array ('persons').get (0).is_object)); -- TRUE - got object

    -- this code works - got "Elon"
    DBMS_OUTPUT.put_line (
        json_object_t.parse (
            json_object_t.parse (l_data).get_object ('data').get_array ('persons').get (0).stringify).get_string (
            'name'));

    -- this code does not work - got exception "PLS-00302: component 'GET_STRING' must be declared"
    --Fixed using TREAT(... as JSON_OBJECT_T)
    DBMS_OUTPUT.put_line (
        TREAT (
            json_object_t.parse (l_data).get_object ('data').get_array ('persons').get (0)
                AS json_object_t).get_string ('name'));
END;

推荐阅读