国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

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

2020-07-26 14:06:15
字體:
來源:轉載
供稿:網友

問題背景:

         當前在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" asimport 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 jsonpkgasfunction 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 jsonpkgasfunction getval(jsonstr varchar2,nodename varchar2) return varchar2as language java name 'JsonUtil.getValue(java.lang.String,java.lang.String) return java.lang.String';function getarrval(jsonArrayStr varchar2,seqNo number) return varchar2as language java name 'JsonUtil.getArrayValue(java.lang.String, java.lang.Integer) return java.lang.String';function getarrlen(jsonArrayStr varchar2) return numberas 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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广南县| 衡阳县| 临猗县| 三江| 天等县| 什邡市| 南召县| 友谊县| 乐昌市| 双柏县| 伊通| 彰武县| 平潭县| 寿光市| 岳西县| 青川县| 民权县| 天津市| 南岸区| 潜山县| 衡山县| 泸西县| 玉屏| 进贤县| 黑水县| 罗城| 盐山县| 台湾省| 张家港市| 思南县| 和龙市| 崇左市| 尼木县| 昭觉县| 邢台市| 仲巴县| 扎赉特旗| 自治县| 新疆| 微山县| 洛南县|