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;
总结:以上解析过程,第一第二层因为直接获取值并赋值给数据库变量,在存储过程中可以多次使用,但是对于第三层的数据,如果需要将数据插入到表中就需要将插入语句放在循环中处理,因为循环的关系,第三层的数据在当前过程中不适合作为变量被其他地方使用;

以上内容由作者本人亲测并整理出来分享给大家,如果中间存在错误或者误导部分,望读者帮忙指正,如果有更好的处理同类型问题的方法,欢迎共同交流!


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值