问题背景:

当前在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

优点:安装方便,解析方法较专业;缺点:新增数据库对象较多,短期学习成本较高。文档很详细,在此不再赘述。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

本文标题: Oracle解析复杂json的方法实例详解

本文地址: http://www.cppcns.com/shujuku/oracle/189956.html

oracle大对象实例_Oracle解析复杂json的方法实例详解相关推荐

  1. Java 解析线程的几种状态详解

    Java 解析线程的几种状态详解 1. 线程的5种状态 从操作系统层面上,任何线程一般都具有五种状态,即创建.就绪.运行.阻塞.终止. (1) 新建状态(NEW) 在程序中用构造方法创建一个新线程时, ...

  2. json文件书写格式详解

    文章来源: 学习通http://www.bdgxy.com/ 目录 ?JSON是什么 为什么有这个技术 JSON 如何使用 - 数据格式 - 注意事项 - JS 内置两个Json方法 实例: ?JSO ...

  3. python中文编码-python中文编码与json中文输出问题详解

    前言 python2.x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍 python 中字符串处理的原理,附带解决 json 文件输出时,显示中文而非 ...

  4. 性能测试之JMeter接口关联【JSON提取器】详解

    1.JSON提取器介绍 相信做过自动化测试的朋友经常会遇到这样的场景:我想调用系统中的某个业务接口,但是需要先登录系统.也就是现在很多接口的访问,都是需要登录接口的token做为基础. 在JMeter ...

  5. 给Clouderamanager集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解)...

    不多说,直接上干货! 这个很简单,在集群机器里,选择就是了,本来自带就有Impala的. 扩展博客 给Ambari集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解) 欢迎大 ...

  6. Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解

    Sonic 开源移动端云真机测试平台 - Agent端服务部署与安卓设备接入演示 一加8手机连接效果图展示 第一章:环境准备 ① agent-sources 资源包下载 ② Android SDK安装 ...

  7. Linux下解析域名命令-dig 命令使用详解

    Linux下解析域名除了使用nslookup之外,开可以使用dig命令来解析域名,dig命令可以得到更多的域名信息.dig 命令主要用来从 DNS 域名服务器查询主机地址信息.dig的全称是 (dom ...

  8. oracle大对象的存储,(16 ) Oracle数据库可以存储极大的对象,CLOB表示【16】大对象。...

    数据示发展是解决一切经济社会问题的( ). 储极凝血因子缺乏患者最适宜输入 患者,大的对象6大对象女性,78岁.输血15分钟后诉胀痛.胸闷.腰背剧烈疼痛,随后出现酱油色尿.尿液呈酱油色,是因为尿中含有 ...

  9. Java解析SQL记录为JSON_Oracle解析复杂json的方法

    问题背景: 当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串,对于结构复杂的json串还无法解析.如此 ...

最新文章

  1. 大数据中台向AI中台演进是大势所趋?
  2. AcWing 730. 机器人跳跃问题
  3. c语言中 各种括号应成对出现,C语言::验证花括号成对出现
  4. 软件设计师 - 超键、无损连接、函数依赖
  5. 使用Python为《围城》做一个图云
  6. Android 系统(159)----MTK 平台过CTA时,发生权限未明示问题
  7. 这款刷爆抖音的玩意儿,竟然是程序员的福音!
  8. hbase shell 入门
  9. 不可错过:教你创造一个有前途的迷你产品(下)
  10. 【E类】Linux视频课程集
  11. USYD悉尼大学DATA1002 OralExam 复习(可能会考的内容)
  12. 上海网站排名优化找哪家?清法网络助你一臂之力
  13. 荣耀Magic5 Pro屏幕参数怎么样? 荣耀Magic5 Pro摄像头参数
  14. sql2000 指定的服务器不存在,SQL Server 2000服务无法启动,提示“系统找不到指定的文件”解决方法及sp4安装不上...
  15. 自己搭建的k8s集群,怎么做负载均衡?
  16. 数据库与身份认证:在项目中操作 MySQL
  17. 【Torch API】pytorch 中torch.ones_like和torch.zeros_like函数详解
  18. RuoYi-Vue,执行npm run dev,报错“RuoYi-Vue\ruoyi-ui\node_modules\eslint\lib\cli-engine\cli-engine.js:421”
  19. fstest下载安装测试
  20. 从程序员到架构师转变【转】

热门文章

  1. Sublime3快捷键大全
  2. buildin 字节交换
  3. dedecms后台验证码错误的解决方法
  4. 获取Mysql语句执行时的详细信息
  5. 《微信小程序开发入门精要》——导读
  6. BaseActivity的抽取
  7. 微软Exchange Server 2013 CU11更新已发布
  8. Datatable删除行的Delete和Remove方法介绍
  9. RHEL7 - 从命令行管理文件
  10. jaxws-webservice编程续