You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle PL/SQL中使用APEX_JSON解析JSON字符串数组问题

解决Oracle PL/SQL中用APEX_JSON解析嵌套数组的问题

我来帮你搞定这个APEX_JSON解析嵌套数组的问题!你的JSON结构里有多层嵌套数组,之前的代码大概率是路径没写对,导致获取不到selectedFilter的数量和值。

首先先明确你的JSON结构:

[{ "category": "New", "subcategory": [{ "subcategoryName": "Refurb", "selectedFilter": ["BRAND", "SIZE"] }] }]

这是一个外层数组,里面包含1个对象;这个对象里有subcategory数组,又包含1个对象;最后这个对象里的selectedFilter就是我们要遍历的目标数组。

接下来给你完整的PL/SQL解析代码,带详细注释:

DECLARE
    l_json_str VARCHAR2(4000) := '[{ "category": "New", "subcategory": [{ "subcategoryName": "Refurb", "selectedFilter": ["BRAND", "SIZE"] }] }]';
    l_outer_count NUMBER;
    l_subcat_count NUMBER;
    l_filter_count NUMBER;
BEGIN
    -- 第一步:解析JSON字符串到APEX_JSON的内存结构中
    apex_json.parse(l_json_str);
    
    -- 获取外层数组的元素数量(这里是1,通用写法兼容多个元素的情况)
    l_outer_count := apex_json.get_count(p_path => '[*]');
    
    -- 遍历外层数组的每个元素
    FOR outer_idx IN 1..l_outer_count LOOP
        -- 获取当前外层元素下subcategory数组的元素数量
        l_subcat_count := apex_json.get_count(p_path => '[' || outer_idx || '].subcategory');
        
        -- 遍历subcategory数组的每个元素
        FOR subcat_idx IN 1..l_subcat_count LOOP
            -- 精准定位到当前subcategory元素下的selectedFilter数组,获取其长度
            l_filter_count := apex_json.get_count(p_path => '[' || outer_idx || '].subcategory[' || subcat_idx || '].selectedFilter');
            
            DBMS_OUTPUT.PUT_LINE('当前子分类: ' || apex_json.get_varchar2(p_path => '[' || outer_idx || '].subcategory[' || subcat_idx || '].subcategoryName'));
            DBMS_OUTPUT.PUT_LINE('筛选器数量: ' || l_filter_count);
            
            -- 遍历selectedFilter数组的每个值
            FOR filter_idx IN 1..l_filter_count LOOP
                DBMS_OUTPUT.PUT_LINE('筛选器值: ' || apex_json.get_varchar2(p_path => '[' || outer_idx || '].subcategory[' || subcat_idx || '].selectedFilter[' || filter_idx || ']'));
            END LOOP;
        END LOOP;
    END LOOP;
END;
/

核心注意事项:

  • APEX_JSON的数组索引是从1开始的,不是常见的0索引,这很容易踩坑!
  • 你之前用p_path=>'.'的问题在于,这个路径指向的是JSON根节点(也就是外层数组),get_count返回的是外层数组的长度,不是selectedFilter的长度,必须精准定位到目标数组的完整路径。
  • 如果你的JSON不是硬编码字符串,而是来自表字段或绑定变量,只需要把l_json_str替换成对应的变量/字段即可。

运行这段代码后,在DBMS输出里会看到:

当前子分类: Refurb
筛选器数量: 2
筛选器值: BRAND
筛选器值: SIZE

这样就能正确遍历selectedFilter数组里的每个值啦!

内容的提问来源于stack exchange,提问作者Viren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:26:00