Oracle-从json对象检索数据,其中包含json列表
所以,我有一个api,它给我一个json_列表,我的程序把它放在一个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" } }] 如果我能删除[],我就能得到它 我正在使用来自的
[{ "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的第三方库,因此如果希望有人能帮助您,您需要发布一个可复制的测试用例。我不知道该怎么做,我已经尝试了许多不同的方法