sql(Oracle)讀取json_list數據和多層嵌套的json數據

最近在開發一個管理系統的時候整理出一個多層嵌套的邏輯,並且在嵌套的最裏層存在一對多的業務關係:

簡單舉例說明:一家水果店出售多種水果(爲了簡化業務結構,就單純一蘋果爲主線),蘋果又分爲多種類型(比如紅蘋果、青蘋果、黃蘋果),所以得到三層結構,每一層都有屬於自己的屬性,這樣就簡單構造出一個三層帶json_list的json報文:

{
    "marketcode": "123456",
    "marketname": "好吃的水果店",
    "address": "一個好地方",
    "tel": "12345678901",
    "fruitlist": {
        "name": "apple",
        "fruitcode": "223344",
        "applelist": [
            {
                "applename": "redapple ",
                "applecode": "111000",
                "price": "10"
            },
            {
                "applename": "greenapple ",
                "applecode": "111111",
                "price": "12"
            },
            {
                "applename": "yellowapple ",
                "applecode": "111222",
                "price": "8"
            }
        ]
    }
}
接下來就是詳細的解析代碼:

declare
  json_varchar2   varchar2(4000);
  inJson          json;
  paramlist       json_list;
  paramJson       json;
  oneJson         json;
  
--變量
  --第一層
  db_marketcode VARCHAR2(8);
  db_marketname VARCHAR2(64);
  db_address    VARCHAR2(64);
  db_tel        VARCHAR2(11);
  --第二層
  db_name       VARCHAR2(64);
  db_fruitcode  VARCHAR2(8);
  
  
  
begin
  json_varchar2:='{
    "marketcode": "123456",
    "marketname": "好吃的水果店",
    "address": "一個好地方",
    "tel": "12345678901",
    "fruitlist": {
        "name": "apple",
        "fruitcode": "223344",
        "applelist": [
            {
                "applename": "redapple ",
                "applecode": "111000",
                "price": "10"
            },
            {
                "applename": "greenapple ",
                "applecode": "111111",
                "price": "12"
            },
            {
                "applename": "yellowapple ",
                "applecode": "111222",
                "price": "8"
            }
        ]
    }
}';
  inJson := json(json_varchar2);
--獲取第一層json值
  db_marketcode=json_get_string(inJson,'marketcode');
  db_marketname=json_get_string(inJson,'marketname');
  db_address=json_get_string(inJson,'address');
  db_tel=json_get_string(inJson,'tel');
--第二層
  db_name:=json_get_string_ext(inJson,'fruitlist.name');
  db_fruitcode:=json_get_string_ext(inJson,'fruitlist.fruitcode');
--接下來獲取第三層,使用json_list來存放json列表
  paramJson := json();
  paramlist := json_list();
  oneJson   := json();
  paramlist  :=json_ext.get_json_list(inJson,'fruitlist.applelist');
--使用循環返回每個json部分的值
   FOR i in 1..paramlist.count LOOP

    oneJson := JSON(paramlist.get(i));
          
    dbms_output.put_line(json_get_string(oneJson,'applename'));
    dbms_output.put_line(json_get_string(oneJson,'applecode'));
    dbms_output.put_line(json_get_string(oneJson,'price'));

    end loop;
end;
總結:以上解析過程,第一第二層因爲直接獲取值並賦值給數據庫變量,在存儲過程中可以多次使用,但是對於第三層的數據,如果需要將數據插入到表中就需要將插入語句放在循環中處理,因爲循環的關係,第三層的數據在當前過程中不適合作爲變量被其他地方使用;

以上內容由作者本人親測並整理出來分享給大家,如果中間存在錯誤或者誤導部分,望讀者幫忙指正,如果有更好的處理同類型問題的方法,歡迎共同交流!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章