如何使用Oracle APEX_JSON从OData响应JSON中获取odata.nextLink
如何用APEX_JSON获取包含点的键值(如odata.nextLink)
嘿,我刚好碰到过一模一样的问题!当JSON键名里带点这种特殊字符时,APEX_JSON的常规点语法确实会失效——因为它默认会把点当成层级分隔符来解析,以为你要找的是odata对象下的nextLink属性,而不是键名本身就是odata.nextLink的字段。
不过别担心,有两种简单的方法可以搞定这个问题:
方法1:使用带引号的路径表达式
直接把完整的键名用引号包起来,再用Oracle的q语法避免转义麻烦:
DECLARE l_json_response VARCHAR2(32767) := '{"odata.nextLink": "https://example.com/odata/nextpage"}'; l_next_link VARCHAR2(4000); BEGIN -- 先解析JSON响应 apex_json.parse(p_source => l_json_response); -- 用带引号的路径获取目标值 l_next_link := apex_json.get_varchar2(q'('odata.nextLink')'); DBMS_OUTPUT.PUT_LINE('获取到的下一页链接:' || l_next_link); END; /
这里的q'()'是Oracle的引用操作符,能让我们直接写带单引号的字符串,不用手动转义,APEX_JSON会把整个'odata.nextLink'当作单个键名来匹配。
方法2:使用数组形式传递键名
另一种方式是把键名作为数组的单个元素传入get_varchar2,这样APEX_JSON不会解析键名里的点:
DECLARE l_json_response VARCHAR2(32767) := '{"odata.nextLink": "https://example.com/odata/nextpage"}'; l_next_link VARCHAR2(4000); BEGIN apex_json.parse(p_source => l_json_response); -- 用数组指定完整键名 l_next_link := apex_json.get_varchar2(p_path => apex_t_varchar2('odata.nextLink')); DBMS_OUTPUT.PUT_LINE('获取到的下一页链接:' || l_next_link); END; /
这种方法更直观,直接告诉APEX_JSON我们要找的键就是odata.nextLink,不需要拆分层级。
额外说明
如果你的JSON结构其实是{"odata": {"nextLink": "xxx"}}(也就是odata是父对象,nextLink是子属性),那常规的apex_json.get_varchar2('odata.nextLink')是有效的。但根据你的描述,显然是键名本身包含点,所以上面两种方法就完全适用啦。
内容的提问来源于stack exchange,提问作者BSharp
相关产品推荐
相关产品推荐

