當(dāng)前在Oracle數(shù)據(jù)庫(11G之前的版本)解析json沒有可以直接使用的系統(tǒng)方法,網(wǎng)上流傳的PLSQL腳本大多也只可以解析結(jié)構(gòu)較單一的json串,對于結(jié)構(gòu)復(fù)雜的json串還無法解析。如此一來導(dǎo)致即便可以在PL/SQL中調(diào)用遠(yuǎn)程接口,但返回結(jié)果仍需傳給前臺js或java等其它代碼進(jìn)行處理,不太方便。
站在用戶的角度思考問題,與客戶深入溝通,找到西區(qū)網(wǎng)站設(shè)計(jì)與西區(qū)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋西區(qū)地區(qū)。分析思路:
1、在PL/SQL中寫json串,無需聲明json對象,只需直接拼接成格式正確的json字符串即可,因此數(shù)據(jù)庫對象間json串的傳遞完全可以用varchar2或clob來代替。
2、結(jié)構(gòu)復(fù)雜的json串節(jié)點(diǎn)元素值基本上可以分為兩類:①仍為json串②json數(shù)組,因此我們只需對這兩種類型的json對象進(jìn)行處理即可。
3、在PL/SQL中處理json數(shù)組時,由于json元素是無序且可以重復(fù)的,因此我們需要對數(shù)組成員進(jìn)行索引并能夠獲取數(shù)組長度才可以對其循環(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類文件
2、執(zhí)行l(wèi)oadjava命令導(dǎo)入處理json所需jar文件,在此選擇org.json而不選擇fastjson或jackson的原因是該jar包沒有外部依賴且滿足功能的同時所需導(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)入,如下:
細(xì)節(jié):如果導(dǎo)入的jar包存在外部依賴,會報(bào)如下異常,繼續(xù)導(dǎo)入外部依賴只會使要導(dǎo)入的jar包越來越多,最終還不一定可以導(dǎo)入成功,得不償失,如下:
3、導(dǎo)入json.jar成功后再次查看當(dāng)前已導(dǎo)入的類文件如下
4、在數(shù)據(jù)庫SQL窗口執(zhí)行以下腳本,創(chuàng)建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串單個節(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個元素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 }
創(chuàng)建成功后再次查詢可以看到對應(yīng)的class文件:
5、利用步驟4創(chuàng)建的class創(chuàng)建function(或procedure),在此為了使其跟目前數(shù)據(jù)庫已存在的json處理方法區(qū)分開,我們創(chuàng)建一個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 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 /
創(chuàng)建成功后可以查看包說明和主體:
6、測試
①簡單json測試
②解析復(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
優(yōu)點(diǎn):安裝方便,解析方法較專業(yè);缺點(diǎn):新增數(shù)據(jù)庫對象較多,短期學(xué)習(xí)成本較高。文檔很詳細(xì),在此不再贅述。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。