网站首页 > java教程 正文
问题背景:
当前在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源码对象
1 create or replace and compile java source named "JsonUtil" as
2
3 import org.json.JSONArray;
4 import org.json.JSONException;
5 import org.json.JSONObject;
6 import java.lang.Integer;
7
8 public class JsonUtil {
9
10 //取json串单个节点值
11 public static String getValue(String jsonStr,String nodeName){
12 String nodeValue="";
13 try {
14 if(jsonStr==null||!jsonStr.startsWith("{")||!jsonStr.endsWith("}")){
15 nodeValue="";
16 }else{
17 JSONObject obj =new JSONObject(jsonStr);
18 nodeValue = obj.getString(nodeName);
19 }
20 } catch (JSONException e) {
21 nodeValue="";
22 }
23 return nodeValue;
24 }
25 //取json数组长度便于循环处理
26 public static Integer getArrayLength(String jsonArrayStr){
27 Integer length=0;
28 try {
29 if(jsonArrayStr==null||!jsonArrayStr.startsWith("[")||!jsonArrayStr.endsWith("]")){
30 length=0;
31 }else{
32 JSONArray jsonArr = new JSONArray(jsonArrayStr);
33 length=jsonArr.length();
34 }
35 } catch (JSONException e) {
36 length=0;
37 }
38 return length;
39 }
40
41 //取json数组第index个元素
42 public static String getArrayValue(String jsonStr,Integer index){
43 String nodeValue="";
44 try {
45 if(jsonStr==null||!jsonStr.startsWith("[")||!jsonStr.endsWith("]")){
46 nodeValue="";
47 }else{
48 JSONArray jsonArr = new JSONArray(jsonStr);
49 nodeValue=jsonArr.getString(index);
50 }
51 } catch (JSONException e) {
52 nodeValue="";
53 }
54 return nodeValue;
55 }
56 }
创建成功后再次查询可以看到对应的class文件:
5、利用步骤4创建的class创建function(或procedure),在此为了使其跟目前数据库已存在的json处理方法区分开,我们创建一个package,如下:
1 create or replace package jsonpkg
2 as
3 function getval(jsonstr varchar2,nodename varchar2) return varchar2;
4 function getarrval(jsonArrayStr varchar2,seqNo number) return varchar2;
5 function getarrlen(jsonArrayStr varchar2) return number;
6 end jsonpkg;
7 /
8 create or replace package body jsonpkg
9 as
10 function getval(jsonstr varchar2,nodename varchar2) return varchar2
11 as language java name 'JsonUtil.getValue(java.lang.String,java.lang.String) return java.lang.String';
12
13 function getarrval(jsonArrayStr varchar2,seqNo number) return varchar2
14 as language java name 'JsonUtil.getArrayValue(java.lang.String, java.lang.Integer) return java.lang.String';
15
16 function getarrlen(jsonArrayStr varchar2) return number
17 as language java name 'JsonUtil.getArrayLength(java.lang.String) return java.lang.Integer';
18
19 end jsonpkg;
20 /
创建成功后可以查看包说明和主体:
6、测试
①简单json测试
②解析复杂json
至此,我们就可以很轻松的就取到json串中任意节点的值(如果节点值为数组则可以先计算数组长度再进行loop循环处理,或直接用getarrval方法取指定数组元素的值)。
方法2:安装开源组件PL/JSON
下载地址: https://github.com/pljson/pljson
优点:安装方便,解析方法较专业;缺点:新增数据库对象较多,短期学习成本较高。文档很详细,在此不再赘述。
本文链接:http://www.cnblogs.com/mobeiyan/p/6810243.html
猜你喜欢
- 2024-10-28 JavaScript获取json中key所对应的value值的简单方法
- 2024-10-28 为什么JSON.parse会损坏大数字,如何解决这个问题?
- 2024-10-28 深入浅出Json-Schema-Validation(深入浅出stm)
- 2024-10-28 这几个JSON 工具,你是不是错过了
- 2024-10-28 深入解析 JSONPath:从入门到精通(jsonpath解析json)
- 2024-10-28 《Servlet》第18节:HttpServletResponse响应JSON和HTML内容
- 2024-10-28 netty系列之:netty中的核心解码器json
- 2024-10-28 Android JSON(android json to room)
- 2024-10-28 一种适合懒人的JSON解析方式(json解析工具哪个好用)
- 2024-10-28 JAVA实现生成多层JSON格式数据(含源码——三层样例)
你 发表评论:
欢迎- 07-15采用Oracle OSB总线进行服务注册和接入
- 07-15javaEE 新闻管理系统 oracle11+tomcat6
- 07-15从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 07-15如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 07-15【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 07-15【mykit-data】 数据库同步工具(数据库表同步工具)
- 07-15[Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- 07-15Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- 最近发表
-
- 采用Oracle OSB总线进行服务注册和接入
- javaEE 新闻管理系统 oracle11+tomcat6
- 从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 【mykit-data】 数据库同步工具(数据库表同步工具)
- [Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- Oracle数据库云服务系列新增前所未有的企业级功能
- 直播预告丨如何实现Oracle存储过程到java的一键转化
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)