主頁 > 知識(shí)庫 > Oracle解析復(fù)雜json的方法實(shí)例詳解

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

熱門標(biāo)簽:理財(cái)產(chǎn)品電銷機(jī)器人 電話機(jī)器人那種好 上海網(wǎng)絡(luò)外呼系統(tǒng) 百度地圖標(biāo)注注解 外呼系統(tǒng)好點(diǎn)子 百度地圖標(biāo)注飯店位置怎么 南通電銷外呼系統(tǒng)哪家強(qiáng) 區(qū)域地圖標(biāo)注怎么設(shè)置 地圖標(biāo)注的坐標(biāo)點(diǎn)

問題背景:

         當(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)行處理,不太方便。

分析思路:

         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類文件

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)入,如下:

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

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

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

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串單個(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ù)組長度便于循環(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文件:

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

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;
/

創(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ù)庫對(duì)象較多,短期學(xué)習(xí)成本較高。文檔很詳細(xì),在此不再贅述。如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • Oracle中的游標(biāo)和函數(shù)詳解
  • oracle獲取當(dāng)前時(shí)間,精確到毫秒并指定精確位數(shù)的實(shí)現(xiàn)方法
  • Linux靜默安裝Oracle11g部分問題的解決方法
  • win10 oracle11g安裝報(bào)錯(cuò)問題集合 附解決方法
  • Oracle連接遠(yuǎn)程數(shù)據(jù)庫的四種方法
  • Oracle存儲(chǔ)過程、包、方法使用總結(jié)(推薦)
  • oracle創(chuàng)建表空間、授權(quán)、創(chuàng)建用戶、導(dǎo)入dmp文件
  • Oracle 如何規(guī)范清理v$archived_log記錄實(shí)例詳解

標(biāo)簽:百色 遼源 自貢 中衛(wèi) 昭通 寧波 海東 紹興

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Oracle解析復(fù)雜json的方法實(shí)例詳解》,本文關(guān)鍵詞  Oracle,解析,復(fù)雜,json,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Oracle解析復(fù)雜json的方法實(shí)例詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Oracle解析復(fù)雜json的方法實(shí)例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章