最近在開發一個管理系統的時候整理出一個多層嵌套的邏輯,並且在嵌套的最裏層存在一對多的業務關係:
簡單舉例說明:一家水果店出售多種水果(爲了簡化業務結構,就單純一蘋果爲主線),蘋果又分爲多種類型(比如紅蘋果、青蘋果、黃蘋果),所以得到三層結構,每一層都有屬於自己的屬性,這樣就簡單構造出一個三層帶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;
總結:以上解析過程,第一第二層因爲直接獲取值並賦值給數據庫變量,在存儲過程中可以多次使用,但是對於第三層的數據,如果需要將數據插入到表中就需要將插入語句放在循環中處理,因爲循環的關係,第三層的數據在當前過程中不適合作爲變量被其他地方使用;
以上內容由作者本人親測並整理出來分享給大家,如果中間存在錯誤或者誤導部分,望讀者幫忙指正,如果有更好的處理同類型問題的方法,歡迎共同交流!