Oracle解析复杂json的方法实例详解
问题背景
当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串,对于结构复杂的json串还无法解析。如此一来导致即便可以在PL/SQL中调用远程接口,但返回结果仍需传给前台js或java等其它代码进行处理,不太方便。
分析思路:
1、在PL/SQL中写json串,无需声明json对象,只需直接拼接成格式正确的json字符串即可,数据库对象间json串的传递完全可以用varchar2或clob来代替。
2、结构复杂的json串节点元素值基本上可以分为两类①仍为json串②json数组,我们只需对这两种类型的json对象进行处理即可。
3、在PL/SQL中处理json数组时,由于json元素是无序且可以重复的,我们需要对数组成员进行索引并能够获取数组长度才可以对其循环处理。
4、java中有很多可以方便解析json串的开源jar包,且数据库支持导入java类文件,是否可以将java代码编译生成的class导入数据处理json呢?
解决方案:
方法1:loadjava导入java类进行解析
1、查看当前数据库已导入的java类文件
2、执行loadjava命令导入处理json所需jar文件,在此选择.json而不选择fastjson或jackson的原因是该jar包没有外部依赖且满足功能的所需导入类文件较少。
--向数据库导入json相关jar包 loadjava -r -f -u scott/tiger@xxx.xxx.xxx.xxx:1521/orcl json.jar --删除指定jar #dropjava -u scott/tiger@xxx.xxx.xxx.xxx:1521/orcl json.jar
在此,我们执行导入,如下:
细节:如果导入的jar包存在外部依赖,会报如下异常,继续导入外部依赖只会使要导入的jar包越来越多,最终还不一定可以导入成功,得不偿失,如下:
3、导入json.jar成功后查看当前已导入的类文件如下
4、在数据库SQL窗口执行以下脚本,创建java源码对象
create or replace and pile java source named "JsonUtil" as import .json.JSONArray; import .json.JSONException; import .json.JSONObject; import java.lang.Integer; public class JsonUtil { //取json串单个节点值 public static String getValue(String jsonStr,String nodeName){ String nodeValue=""; try { if(jsonStr==null||!jsonStr.startsWith("{")||!jsonStr.endsWith("}")){ nodeValue=""; }else{ JSONObject obj =new JSONObject(jsonStr); nodeValue = obj.getString(nodeName); } } catch (JSONException e) { nodeValue=""; } return nodeValue; } //取json数组长度便于循环处理 public static Integer getArrayLength(String jsonArrayStr){ Integer length=0; try { if(jsonArrayStr==null||!jsonArrayStr.startsWith("[")||!jsonArrayStr.endsWith("]")){ length=0; }else{ JSONArray jsonArr = new JSONArray(jsonArrayStr); length=jsonArr.length(); } } catch (JSONException e) { length=0; } return length; } //取json数组第index个元素 public static String getArrayValue(String jsonStr,Integer index){ String nodeValue=""; try { if(jsonStr==null||!jsonStr.startsWith("[")||!jsonStr.endsWith("]")){ nodeValue=""; }else{ JSONArray jsonArr = new JSONArray(jsonStr); nodeValue=jsonArr.getString(index); } } catch (JSONException e) { nodeValue=""; } return nodeValue; } }
创建成功后查询可以看到对应的class文件:
5、利用步骤4创建的class创建function(或procedure),在此为了使其跟目前数据库已存在的json处理方法区分开,我们创建一个package,如下:
create or replace package jsonpkg as function getval(jsonstr varchar2,nodename varchar2) return varchar2; function getarrval(jsonArrayStr varchar2,seqNo number) return varchar2; function getarrlen(jsonArrayStr varchar2) return number; end jsonpkg; / create or replace package body jsonpkg as function getval(jsonstr varchar2,nodename varchar2) return varchar2 as language java name 'JsonUtil.getValue(java.lang.String,java.lang.String) return java.lang.String'; function getarrval(jsonArrayStr varchar2,seqNo number) return varchar2 as language java name 'JsonUtil.getArrayValue(java.lang.String, java.lang.Integer) return java.lang.String'; function getarrlen(jsonArrayStr varchar2) return number as language java name 'JsonUtil.getArrayLength(java.lang.String) return java.lang.Integer'; end jsonpkg; /
创建成功后可以查看包说明和主体:
6、测试
①简单json测试
②解析复杂json
至此,我们就可以很轻松的就取到json串中任意节点的值(如果节点值为数组则可以先计算数组长度再进行loop循环处理,或直接用getarrval方法取指定数组元素的值)。
方法2:安装开源组件PL/JSON
下载地址:
优点:安装方便,解析方法较专业;缺点:新增数据库对象较多,短期学习成本较高。文档很详细,在此不再赘述。如果大家有任何疑问请给我留言,长沙网络推广会及时回复大家的。在此也非常感谢大家对狼蚁SEO网站的支持!
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南