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/x.xxx:1521/orcl json.jar
-
-删除指定jar
#dropjava -u scott/x.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("{")||!dsWith("}")){
nodeValue="";
}else{
JSONObject obj =new JSONObject(jsonStr);
nodeValue = String(nodeName);
}
} catch (JSONException e) {
nodeValue="";
}
return nodeValue;
}
//取json数组长度便于循环处理
public static Integer getArrayLength(String jsonArrayStr){
Integer length=0;
try {
if(jsonArrayStr==null||!jsonArrayStr.startsWith("[")||!dsWith("]")){
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("[")||!dsWith("]")){
nodeValue="";
}else{
JSONArray jsonArr = new JSONArray(jsonStr);
String(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;
oracle 字符串转数组end jsonpkg;
/
create or replace package body jsonpkg
as
function getval(jsonstr varchar2,nodename varchar2) return varchar2
as language java name 'Value(java.lang.String,java.lang.String) return java.lang.String';
function getarrval(jsonArrayStr varchar2,seqNo number) return varchar2
as language java name 'ArrayValue(java.lang.String, java.lang.Integer) return java.lang.String';
function getarrlen(jsonArrayStr varchar2) return number
as language java name 'ArrayLength(java.lang.String) return java.lang.Integer';
end jsonpkg;
/
创建成功后可以查看包说明和主体:
6、测试
①简单json测试
②解析复杂json
⾄此,我们就可以很轻松的就取到json串中任意节点的值(如果节点值为数组则可以先计算数组长度再进⾏loop循环处理,或直接⽤getarrval⽅法取指定数组元素的值)。
⽅法2:安装开源组件PL/JSON
下载地址: github/pljson/pljson
优点:安装⽅便,解析⽅法较专业;缺点:新增数据库对象较多,短期学习成本较⾼。⽂档很详细,在此不再赘述。
尊重他⼈劳动成果,转载请注明本⽂链接:wwwblogs/mobeiyan/p/6810243.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论