Oracle - извлечение данных из json объекта со списком json внутри - PullRequest
0 голосов
/ 01 февраля 2020

Итак, у меня есть этот API, который сообщает мне список json_, и моя программа помещает его в объект json, который я не могу изменить. Мне нужно извлечь из него информацию, но я не могу.

Мой json файл:

[{ "idSolic" : "1234",
    "Status" : {
                 "code" : "502",
                 "description" : "i cant get the data" 
                }
 }]

Если бы я только мог удалить [], я бы смог его получить.

Я просыпаюсь с pl / sql с использованием json объектов из Документация GitHub

Я работаю с PL / JSON V1_0_5 и oracle 12 c.

Мой код:

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_list, затем получите последний объект списка и поместите его в объект json, но я получил ошибки типа буфера из пространства.

1 Ответ

0 голосов
/ 19 марта 2020

Прежде всего, ваш параметр OUT p_resp_ json в вашем коде имеет тип json, но данные, которые вы вставили в качестве содержимого этого параметра, не совместимы с типом json, но с типом json_list. Это массив, и невозможно разобрать такую ​​строку в объект с типом json - вы получите:

ORA-20101: JSON Parser exception - no { start found

Вы можете хранить json_list внутри 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 с помощью метода p_resp_ json .print () - it проанализирует его в строку и запишет результат в вывод.

...