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文件,在此选择org.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 compile java source named "JsonUtil" as import org.json.JSONArray;
import org.json.JSONException;
import org.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
下载地址: https://github.com/pljson/pljson

优点:安装方便,解析方法较专业;缺点:新增数据库对象较多,短期学习成本较高。文档很详细,在此不再赘述。
尊重他人劳动成果,转载请注明本文链接:http://www.cnblogs.com/mobeiyan/p/6810243.html
Oracle解析复杂json的方法的更多相关文章
- Oracle解析复杂json的方法(转)
转:Oracle解析复杂json的方法 问题背景: 当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串, ...
- Oracle 使用GSON库解析复杂json串
在前文中讲到了如何使用JSON标准库解析json串,参考: Oracle解析复杂json的方法(转) 现补充一篇使用GSON库在Oracle中解析复杂json的方法. GSON串的使用教程参考官方文档 ...
- JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串;JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象
JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串:JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象
- vbs 解析 json jsonp 方法
昨天说了下用 htmlfile 来解析 html,今天依然用他来解析,htmlfile 是一个 COM 版的 BOM 和 DOM,所以解析 html, 执行 js 完全不在话下,今天就继续解析 jso ...
- JSON.parse() 方法解析一个JSON字符串
JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换. 语法EDIT JSON.pa ...
- JSON 解析的两种方法
今天帮朋友看了下JSON解析结果············· eval解析JSON中的注意点 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. ...
- 解析oracle对select加锁的方法以及锁的查询 转
转自 https://www.jb51.net/article/37587.htm 本篇文章是对oracle对select加锁的方法以及锁的查询进行了详细的分析介绍,需要的朋友参考下 解析oracle ...
- JavaScript转换与解析JSON的方法
在JavaScript中将JSON的字符串解析成JSON数据格式,一般有两种方式: 一种为使用eval()函数. 使用Function对象来进行返回解析. 使用eval函数来解析,jquery的eac ...
- VBScript把json字符串解析成json对象的2个方法
这篇文章主要介绍了VBScript把json字符串解析成json对象的2个方法,本文通过MSScriptControl.ScriptControl和jscript实现,需要的朋友可以参考下 asp/v ...
随机推荐
- 两种构造 String 的方法效率比较
直接上代码吧: package mm_test; /** * @Function: TODO ADD FUNCTION. <br/> * @Date: 2016年4月14日 下午8:25: ...
- cssLoading效果
http://files.cnblogs.com/files/xdoudou/loaders.css-master.zip
- 解决MVC模型验证在IE 6 7下不起作用或者报错
文件版本列出: Jquery版本1.7.1 jQuery Validation 版本1.9.0 (VS2012创建MVC项目自动生成的版本) 最好VS2012创建MVC项目自动生成的版本,而不是VS2 ...
- [UWP]了解模板化控件(2):模仿ContentControl
ContentControl是最简单的TemplatedControl,而且它在UWP出场频率很高.ContentControl和Panel是VisualTree的基础,可以说几乎所有VisualTr ...
- 蓄水池抽样(原理&实现)
前言: 蓄水池抽样:从N个元素中随机的等概率的抽取k个元素,其中N无法确定. 适用场景: 模式识别等概率抽样,抽样查看渐增的log日志(无法先保存整个数据流然后再从中选取,而是期望有一种将数据流遍历一 ...
- webkit图片滤镜
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- linux—粘滞位的设置
粘滞位(Stickybit),或粘着位,是Unix文件系统权限的一个旗标.最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件.如果不为目录设置粘滞位,任 ...
- Spring + qyartz+多任务实现任务调度功能。
前记:如果配置多个任务不能触发的请仔细检查配置文件!!!!!! 不存在多个同时间任务不能触发的现象!!!! 这个东西记得不要设置成false.如果写了就是true.不写的话默认true. 下面开始贴配 ...
- icheck样式绑定与翻页保持
官方文档:http://icheck.fronteed.com/ 使用基本样式 $('input').iCheck({ checkboxClass : 'icheckbox_square-blue', ...
- Google永远不可能回到国内,只能是回忆
今天早上在微博上无意看 [谷歌翻译App在大陆地区恢复无障碍使用]这篇文章,不知不觉就点进去看一下,内心还是比较兴奋,为什么兴奋说不清楚.或许我们是真的喜欢Google的产品. 回想2010年Goog ...