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
相关产品推荐
相关产品推荐

