麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 數(shù)據(jù)庫(kù) > Oracle > 正文

Oracle解析復(fù)雜json的方法實(shí)例詳解

2024-08-29 14:00:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

問(wèn)題背景:

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

分析思路:

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

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

復(fù)雜json解析,oracle,解析json

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

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

解決方案:

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

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

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

--向數(shù)據(jù)庫(kù)導(dǎo)入json相關(guān)jar包loadjava -r -f -u scott/[email protected]:1521/orcl json.jar--刪除指定jar#dropjava -u scott/[email protected]:1521/orcl json.jar

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

復(fù)雜json解析,oracle,解析json

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

復(fù)雜json解析,oracle,解析json

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

復(fù)雜json解析,oracle,解析json

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

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

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

復(fù)雜json解析,oracle,解析json

5、利用步驟4創(chuàng)建的class創(chuàng)建function(或procedure),在此為了使其跟目前數(shù)據(jù)庫(kù)已存在的json處理方法區(qū)分開(kāi),我們創(chuàng)建一個(gè)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;/

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

復(fù)雜json解析,oracle,解析json

復(fù)雜json解析,oracle,解析json

6、測(cè)試

①簡(jiǎn)單json測(cè)試

復(fù)雜json解析,oracle,解析json

復(fù)雜json解析,oracle,解析json

復(fù)雜json解析,oracle,解析json

②解析復(fù)雜json

復(fù)雜json解析,oracle,解析json

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

方法2:安裝開(kāi)源組件PL/JSON

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

復(fù)雜json解析,oracle,解析json

優(yōu)點(diǎn):安裝方便,解析方法較專(zhuān)業(yè);缺點(diǎn):新增數(shù)據(jù)庫(kù)對(duì)象較多,短期學(xué)習(xí)成本較高。文檔很詳細(xì),在此不再贅述。如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VeVb武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到oracle教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美精品成人一区二区三区四区 | 亚洲激情91| 蜜桃网站在线观看 | 亚洲精品久久久久久久久久久 | 黄色片免费看网站 | 欧美成人黄色小视频 | 欧美日韩免费一区 | 国产一级淫片a级aaa | 国产精品麻豆一区二区三区 | 蜜桃视频观看麻豆 | 色污视频 | 欧美国产精品一区二区 | 精品国产一区二区三区四区在线 | 国产精品啪 | 青青青在线免费 | 欧美18—19sex性护士中国 | 性爱视频免费 | 久草成人在线观看 | 久久99精品久久久久久秒播放器 | 国产精品亚洲欧美一级在线 | 中文字幕在线观看91 | 日韩黄色免费观看 | 欧美在线小视频 | 国产精品91久久久 | 欧美一区二区三区久久精品视 | 黑人日比 | 羞羞色网站 | 久草在线高清视频 | 国产98色 | 激情综合网俺也去 | 深夜福利视频绿巨人视频在线观看 | 久久精品亚洲一区二区 | 亚洲操比视频 | 亚洲精品一区二区三区大胸 | 99国产精品国产免费观看 | 成人毛片免费视频 | 国内自拍网址 | 欧美一级高潮片免费的 | 久久电影一区二区 | 欧美日韩综合视频 | 国产精品a一 |