欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Oracle解析復(fù)雜json的方法

當(dāng)前在Oracle數(shù)據(jù)庫(11G之前的版本)解析json沒有可以直接使用的系統(tǒng)方法,網(wǎng)上流傳的PLSQL腳本大多也只可以解析結(jié)構(gòu)較單一的json串,對(duì)于結(jié)構(gòu)復(fù)雜的json串還無法解析。如此一來導(dǎo)致即便可以在PL/SQL中調(diào)用遠(yuǎn)程接口,但返回結(jié)果仍需傳給前臺(tái)js或java等其它代碼進(jìn)行處理,不太方便。

成都創(chuàng)新互聯(lián)公司的客戶來自各行各業(yè),為了共同目標(biāo),我們?cè)诠ぷ魃厦芮信浜?,從?chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領(lǐng)域包括成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺(tái)開發(fā)。

分析思路:

         1、在PL/SQL中寫json串,無需聲明json對(duì)象,只需直接拼接成格式正確的json字符串即可,因此數(shù)據(jù)庫對(duì)象間json串的傳遞完全可以用varchar2或clob來代替。

         2、結(jié)構(gòu)復(fù)雜的json串節(jié)點(diǎn)元素值基本上可以分為兩類:①仍為json串②json數(shù)組,因此我們只需對(duì)這兩種類型的json對(duì)象進(jìn)行處理即可。

         3、在PL/SQL中處理json數(shù)組時(shí),由于json元素是無序且可以重復(fù)的,因此我們需要對(duì)數(shù)組成員進(jìn)行索引并能夠獲取數(shù)組長度才可以對(duì)其循環(huán)處理。

         4、java中有很多可以方便解析json串的開源jar包,且數(shù)據(jù)庫支持導(dǎo)入java類文件,因此是否可以將java代碼編譯生成的class導(dǎo)入數(shù)據(jù)處理json呢?

解決方案:

方法1:loadjava導(dǎo)入java類進(jìn)行解析

1、查看當(dāng)前數(shù)據(jù)庫已導(dǎo)入的java類文件

Oracle解析復(fù)雜json的方法

2、執(zhí)行l(wèi)oadjava命令導(dǎo)入處理json所需jar文件,在此選擇org.json而不選擇fastjson或jackson的原因是該jar包沒有外部依賴且滿足功能的同時(shí)所需導(dǎo)入類文件較少。

--向數(shù)據(jù)庫導(dǎo)入json相關(guān)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

在此,我們執(zhí)行導(dǎo)入,如下:

 Oracle解析復(fù)雜json的方法

細(xì)節(jié):如果導(dǎo)入的jar包存在外部依賴,會(huì)報(bào)如下異常,繼續(xù)導(dǎo)入外部依賴只會(huì)使要導(dǎo)入的jar包越來越多,最終還不一定可以導(dǎo)入成功,得不償失,如下:

 Oracle解析復(fù)雜json的方法

3、導(dǎo)入json.jar成功后再次查看當(dāng)前已導(dǎo)入的類文件如下

 Oracle解析復(fù)雜json的方法

4、在數(shù)據(jù)庫SQL窗口執(zhí)行以下腳本,創(chuàng)建java源碼對(duì)象

Oracle解析復(fù)雜json的方法

 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串單個(gè)節(jié)點(diǎn)值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數(shù)組長度便于循環(huán)處理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數(shù)組第index個(gè)元素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 }

Oracle解析復(fù)雜json的方法

創(chuàng)建成功后再次查詢可以看到對(duì)應(yīng)的class文件:

 Oracle解析復(fù)雜json的方法

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

Oracle解析復(fù)雜json的方法

 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 as10 function  getval(jsonstr varchar2,nodename varchar2) return varchar211 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 varchar214 as language java name 'JsonUtil.getArrayValue(java.lang.String, java.lang.Integer) return java.lang.String';15 16 function getarrlen(jsonArrayStr varchar2) return number17 as language java name 'JsonUtil.getArrayLength(java.lang.String) return java.lang.Integer';18 19 end jsonpkg;20 /

Oracle解析復(fù)雜json的方法

創(chuàng)建成功后可以查看包說明和主體:

Oracle解析復(fù)雜json的方法

Oracle解析復(fù)雜json的方法

6、測(cè)試

①簡單json測(cè)試

 Oracle解析復(fù)雜json的方法

Oracle解析復(fù)雜json的方法

Oracle解析復(fù)雜json的方法

②解析復(fù)雜json

 Oracle解析復(fù)雜json的方法

至此,我們就可以很輕松的就取到j(luò)son串中任意節(jié)點(diǎn)的值(如果節(jié)點(diǎn)值為數(shù)組則可以先計(jì)算數(shù)組長度再進(jìn)行l(wèi)oop循環(huán)處理,或直接用getarrval方法取指定數(shù)組元素的值)。

 

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

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

 Oracle解析復(fù)雜json的方法

優(yōu)點(diǎn):安裝方便,解析方法較專業(yè);缺點(diǎn):新增數(shù)據(jù)庫對(duì)象較多,短期學(xué)習(xí)成本較高。文檔很詳細(xì),在此不再贅述。

新聞名稱:Oracle解析復(fù)雜json的方法
網(wǎng)頁地址:http://chinadenli.net/article36/gisepg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)網(wǎng)站設(shè)計(jì)公司、微信小程序、營銷型網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)