Oracle-从json对象检索数据,其中包含json列表

Oracle-从json对象检索数据,其中包含json列表,json,oracle,plsql,pljson,Json,Oracle,Plsql,Pljson,所以,我有一个api,它给我一个json_列表,我的程序把它放在一个json对象中,我不能更改它。我需要从中检索信息,但我不能 我的json文件: [{ "idSolic" : "1234", "Status" : { "code" : "502", "description" : "i cant get the data" } }] 如果我能删除[],我就能得到它 我正在使用来自的

所以,我有一个api,它给我一个json_列表,我的程序把它放在一个json对象中,我不能更改它。我需要从中检索信息,但我不能

我的json文件:

[{ "idSolic" : "1234",
    "Status" : {
                 "code" : "502",
                 "description" : "i cant get the data" 
                }
 }]
如果我能删除[],我就能得到它

我正在使用来自的json对象处理pl/sql

我正在使用PL/JSON V1_0_5和oracle 12c

我的代码是:

FUNCTION GET_INVOICE_STATUS(  p_chave_tabela   apps.json
     , p_company        VARCHAR2
     , p_invoice        VARCHAR2
     , p_resp_json      OUT json
     , p_id_solicitacao OUT NUMBER)
    RETURN VARCHAR2
    IS
        PRAGMA               AUTONOMOUS_TRANSACTION;
    --   
        l_authorization      VARCHAR2(4096);
        l_status_solicitacao VARCHAR2(2048);
        l_nome_processo      VARCHAR2(100) := 'invoices/sefaz';
        l_request            utl_http.req;
        l_response           utl_http.resp; 
        l_host               VARCHAR2(1024);
        l_chave_tabela_clob  CLOB := empty_clob();
        l_clob_raw           CLOB := empty_clob();
        l_id_solicitacao     NUMBER;
        l_resp_list          apps.json_list;
        --
    BEGIN
    --
    xxavl_util_pkg.inicia_host_token(p_host => l_host, p_token => l_authorization);
        --
        --l_authorization := 'Bearer ' || l_authorization;
        l_host          := l_host    || l_nome_processo || '/' || trim(p_invoice)   ;
        --l_host    || l_nome_processo || '/' ||p_invoice  ;
        --
        dbms_output.put_line(l_host);
        --
        dbms_output.put_line(xxavl_util_pkg.g_autenticacao_padrao);
        utl_http.set_wallet('file:/home/oracle/wallet','NULL');
        --
        l_request := utl_http.begin_request(l_host, 'GET', 'HTTP/1.1');
        --
      --utl_http.set_header(l_request, 'authorization', l_authorization);                                -- 02/07/2018
        utl_http.set_header(l_request, 'authorization', xxavl_util_pkg.g_autenticacao_padrao);           -- 02/07/2018
        --
        utl_http.set_header(l_request, 'User-agent', 'Apache-HttpClient/4.1.1');
        utl_http.set_header(l_request, 'accept', 'application/json');
        utl_http.set_header(l_request, 'Content-Type', 'application/json');
    --
    --
    l_response := utl_http.get_response(l_request);
    --
    BEGIN
    --
    l_status_solicitacao := xxavl_util_pkg.trata_resposta(l_response, p_resp_json, l_clob_raw); --treats the http request and give me back it in a json variable p_resp_json
    --
    --l_resp_list := apps.json_list(p_resp_json.to_char).to_json_value;
    --p_resp_json := apps.json(l_resp_list);
    --dbms_output.put_line(p_resp_json.to_char);
    --
    dbms_output.put_line(apps.json_ext.get_string(p_resp_json, 'status.protocol') || '-----------------' );

我需要获取“status.protocol”,但由于我的json位于“[]”内,我无法执行此操作,我尝试将其转换为json_列表,然后获取最后一个列表对象并将其放入json对象内,但出现了诸如缓冲区空间不足之类的错误。

首先,代码中的OUT参数p_resp_json具有json类型,但粘贴为此参数内容的数据与json类型不兼容,而是与json_列表类型兼容。它是一个数组,不可能将此类字符串解析为json类型的对象-您将得到:

ORA-20101: JSON Parser exception - no { start found
您可以将json_列表存储在json中,但必须对其进行命名,例如:

{
  "myArray": [
    {
        "idSolic": "1234",
        "Status": {
            "code": "502",
            "description": "i cant get the data"
        }
    }
  ]
}
其次,您不能将路径作为“status.protocol”传递以从数组中检索数据,因为您不知道要获取哪一个数组元素。您必须向路径添加索引。要从上面粘贴的json中检索“代码”,您可以使用:

json_ext.get_string( p_resp_json, 'myArray[1].Status.code' )

您可以通过p_resp_json.print()方法检查p_resp_json中的内容-它将解析为字符串并在输出中写入结果。

恐怕我不理解您的代码,但如果您有一个包含json的字符串变量,解析它应该非常简单。试着这样做:

set serveroutput on
declare
   v_resp  clob := '[{ "idSolic": "1234", "Status": { "code": "502", "description": "i cant get the data" } }]';
   v_jsonl json_list := json_list(v_resp);
   v_json  json;
begin
   for i in 1..v_jsonl.count loop
      v_json := json(v_jsonl.get(i));
      dbms_output.put_line('idSolic=' || v_json.get('idSolic').get_string);
      v_json := json(v_json.get('Status'));
      dbms_output.put_line('Status=' || v_json.get('description').get_string);
   end loop;
end;

你说“你不能”是什么意思。有什么问题?你有什么错误吗?您尝试了什么?您使用的是哪一版本的Oracle?PL/JSON的哪个版本?请发布您正在运行的代码。您使用的是一个非标准Oracle的第三方库,因此如果希望有人能帮助您,您需要发布一个可复制的测试用例。我不知道该怎么做,我已经尝试了许多不同的方法