一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - Oracle解析復雜json的方法實例詳解

Oracle解析復雜json的方法實例詳解

2020-01-12 16:22漠北雁 Oracle

這篇文章主要介紹了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對象進行處理即可。

Oracle解析復雜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包沒有外部依賴且滿足功能的同時所需導入類文件較少。

?
1
2
3
4
--向數據庫導入json相關jar包
loadjava -r -f -u scott/[email protected]:1521/orcl json.jar
--刪除指定jar
#dropjava -u scott/[email protected]:1521/orcl json.jar

在此,我們執行導入,如下:

Oracle解析復雜json的方法實例詳解

細節:如果導入的jar包存在外部依賴,會報如下異常,繼續導入外部依賴只會使要導入的jar包越來越多,最終還不一定可以導入成功,得不償失,如下:

Oracle解析復雜json的方法實例詳解

3、導入json.jar成功后再次查看當前已導入的類文件如下

Oracle解析復雜json的方法實例詳解

4、在數據庫SQL窗口執行以下腳本,創建java源碼對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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文件:

Oracle解析復雜json的方法實例詳解

5、利用步驟4創建的class創建function(或procedure),在此為了使其跟目前數據庫已存在的json處理方法區分開,我們創建一個package,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
/

創建成功后可以查看包說明和主體:

Oracle解析復雜json的方法實例詳解

Oracle解析復雜json的方法實例詳解

6、測試

①簡單json測試

Oracle解析復雜json的方法實例詳解

Oracle解析復雜json的方法實例詳解

Oracle解析復雜json的方法實例詳解

②解析復雜json

Oracle解析復雜json的方法實例詳解

至此,我們就可以很輕松的就取到json串中任意節點的值(如果節點值為數組則可以先計算數組長度再進行loop循環處理,或直接用getarrval方法取指定數組元素的值)。

方法2:安裝開源組件PL/JSON

下載地址: https://github.com/pljson/pljson

Oracle解析復雜json的方法實例詳解

優點:安裝方便,解析方法較專業;缺點:新增數據庫對象較多,短期學習成本較高。文檔很詳細,在此不再贅述。如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cnblogs.com/mobeiyan/p/6810243.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲高清一区二区三区四区 | 青草福利视频 | 美女伊人网 | 日韩夫妻性生活 | 黄 色 大 片 网站 | 无套暴躁白丝秘书 | 免费高清特黄a 大片 | 欧美亚洲国产一区二区三区 | 精品视频一区二区观看 | 亚洲国产成人久久综合区 | 亚洲国产精品久久精品成人网站 | 久久青青草原综合伊人 | 欧美特黄视频在线观看 | 欧美日韩一区二区综合在线视频 | 国产情侣啪啪 | 色综色天天综合网 | 国产欧美日韩综合 | 欧美精品超清在线播放 | 亚州中文字幕 | 激情小视频网站 | 国产欧美日韩综合二区三区 | 九九精品免视频国产成人 | 免费黄色网站视频 | 亚洲精品国产国语 | 国产大片免费在线观看 | 亚洲看片lutube在线入口 | 国产亚洲欧美日韩俺去了 | 天天干女人 | 亚欧有色在线观看免费版高清 | 和日本免费不卡在线v | aigao视频| 跪在老师脚下吃丝袜脚 | 久久这里只有精品无码3D | 高清视频在线观看+免费 | 青青青国产视频 | 国产精品99在线观看 | 亚洲国产情侣偷自在线二页 | 日本中文字幕高清 | 亚洲欧美日韩综合一区久久 | 色综合久久夜色精品国产 | 午夜片神马影院福利 |