使用apex_json获取二级嵌套JSON数组值时返回null问题求助
问题原因
你代码中filter_value始终返回null的核心问题出在嵌套循环的取值逻辑:
- 调用
APEX_JSON.get_varchar2获取数组值时,额外传入了未声明、未初始化的l_json_values参数。你当前使用的是APEX_JSON.parse(v_a)全局解析模式,没有显式将解析结果存入自定义的apex_json.t_values类型变量,此时调用取值方法不需要传p_values参数,传入未赋值的参数会导致路径匹配失败,返回null。
修正方案(两种可选)
方案1:最简修正(保留全局解析模式)
仅需要删除取值语句中多余的p_values => l_json_values参数即可,完整修正后代码如下:
DECLARE v_a VARCHAR2(5000) := '{ "lovFilters": [ { "lovFor": "Ids", "values": [1,2,3] }, { "lovFor": "Amounts", "values": [20,30,50,60] } ] }'; v_array_count NUMBER := 0; lov_for VARCHAR2(30); filter_value VARCHAR2(256); v_count_2 NUMBER:= 0; BEGIN APEX_JSON.parse(v_a); v_array_count := APEX_JSON.get_count(p_path => 'lovFilters'); dbms_output.put_line ('FILTER array count : '||v_array_count); FOR lr_i IN 1 .. v_array_count LOOP dbms_output.put_line ('-------------------------'); lov_for := APEX_JSON.get_varchar2 (p_path => 'lovFilters[%d].lovFor', p0 => lr_i); dbms_output.put_line ('lov_for : '||lov_for); v_count_2 := APEX_JSON.get_count(p_path => 'lovFilters[%d].values', p0 => lr_i); dbms_output.put_line ('v_count_2 : '||v_count_2); dbms_output.put_line ('--------------------------'); FOR lr_n IN 1 .. v_count_2 LOOP filter_value := APEX_JSON.get_varchar2(p_path => 'lovFilters[%d].values[%d]', p0 => lr_i, p1 => lr_n); dbms_output.put_line ('filter_value : '||filter_value); END LOOP; END LOOP; END; /
方案2:显式使用解析变量(推荐,避免全局解析冲突)
如果要使用p_values参数,需要补全变量声明和解析赋值逻辑:
DECLARE v_a VARCHAR2(5000) := '{ "lovFilters": [ { "lovFor": "Ids", "values": [1,2,3] }, { "lovFor": "Amounts", "values": [20,30,50,60] } ] }'; v_array_count NUMBER := 0; lov_for VARCHAR2(30); filter_value VARCHAR2(256); v_count_2 NUMBER:= 0; l_json_values apex_json.t_values; -- 新增声明解析结果变量 BEGIN APEX_JSON.parse(l_json_values, v_a); -- 解析结果存入变量 v_array_count := APEX_JSON.get_count(p_values => l_json_values, p_path => 'lovFilters'); dbms_output.put_line ('FILTER array count : '||v_array_count); FOR lr_i IN 1 .. v_array_count LOOP dbms_output.put_line ('-------------------------'); lov_for := APEX_JSON.get_varchar2 (p_values => l_json_values, p_path => 'lovFilters[%d].lovFor', p0 => lr_i); dbms_output.put_line ('lov_for : '||lov_for); v_count_2 := APEX_JSON.get_count(p_values => l_json_values, p_path => 'lovFilters[%d].values', p0 => lr_i); dbms_output.put_line ('v_count_2 : '||v_count_2); dbms_output.put_line ('--------------------------'); FOR lr_n IN 1 .. v_count_2 LOOP filter_value := APEX_JSON.get_varchar2(p_values => l_json_values, p_path => 'lovFilters[%d].values[%d]', p0 => lr_i, p1 => lr_n); dbms_output.put_line ('filter_value : '||filter_value); END LOOP; END LOOP; END; /
运行输出
两种方案运行后输出均符合你的预期:
FILTER array count : 2 ------------------------- lov_for : Ids v_count_2 : 3 -------------------------- filter_value : 1 filter_value : 2 filter_value : 3 ------------------------- lov_for : Amounts v_count_2 : 4 -------------------------- filter_value : 20 filter_value : 30 filter_value : 50 filter_value : 60
内容的提问来源于stack exchange,提问作者LNM
相关产品推荐
相关产品推荐

