2017-02-25 32 views
0

我在CLOB像APEX_JSON.PARSE。如何应对恐怖JSON

{"response":"{\"atr1\":1.0,\"atr2\":2.0,\"atr3\":3.0};"} 

属性超过9000

我想apex_json解析一个巨大的JSON:

declare 
    lgk varchar2(50); 
begin 
    apex_json.parse(i); 
    lgk := apex_json.get_varchar2(p_path => 'response'); 
    dbms_output.put_line(lgk); 
end; 

在输出我可以看到像

{"atr1":1.0,"atr2":2.0,"atr3":3.0}; 

如果我试图再次解析这个,我w生病得到一个错误:意想不到的字符“;”。 我如何验证JSON并将项目替换为“;”使用apex?我真的不想解析clob到varchar2并替换我需要的东西。

回答

0

首先,您的response值(即:"{\"atr1\":1.0,\"atr2\":2.0,\"atr3\":3.0};")不是有效的json对象。这只是一个字符串值。删除双引号和正斜杠和验证,你会得到如下:

{"atr1":1.0,"atr2":2.0,"atr3":3.0}; 

您可以在线验证它here,你会得到错误,因为;

因此,正确的在JSON的格式应该如下:

{"response":"{"atr1":1.0,"atr2":2.0,"atr3":3.0}} 

其次,你不需要解析两次,你解析一次,然后你取你需要根据你传递路径参数的任何值。例如,以下是修改后的代码:

declare 
    json_clob clob := '{"response":{"atr1":1.0,"atr2":2.0,"atr3":3.0}}'; 
    lgk varchar2(50); 
begin 
    apex_json.parse(json_clob); 
    lgk := apex_json.get_number(p_path => 'response.atr1'); 
    dbms_output.put_line(lgk); 
end; 
/

--output: 
--1