getstring方法_Oracle解析复杂json的方法

问题背景:

当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串,对于结构复杂的json串还无法解析。如此一来导致即便可以在PL/SQL中调用远程接口,但返回结果仍需传给前台js或java等其它代码进行处理,不太方便。

分析思路:

1、在PL/SQL中写json串,无需声明json对象,只需直接拼接成格式正确的json字符串即可,因此数据库对象间json串的传递完全可以用varchar2或clob来代替。

2、结构复杂的json串节点元素值基本上可以分为两类:①仍为json串②json数组,因此我们只需对这两种类型的json对象进行处理即可。

3、在PL/SQL中处理json数组时,由于json元素是无序且可以重复的,因此我们需要对数组成员进行索引并能够获取数组长度才可以对其循环处理。

4、java中有很多可以方便解析json串的开源jar包,且数据库支持导入java类文件,因此是否可以将java代码编译生成的class导入数据处理json呢?

解决方案:

方法1:loadjava导入java类进行解析

1、查看当前数据库已导入的java类文件

1fa9f23153c0b8a87a57a62ab444367c.png

2、执行loadjava命令导入处理json所需jar文件,在此选择org.json而不选择fastjson或jackson的原因是该jar包没有外部依赖且满足功能的同时所需导入类文件较少。

--向数据库导入json相关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

在此,我们执行导入,如下:

7583620acf370dce16e313bd985201b0.png

细节:如果导入的jar包存在外部依赖,会报如下异常,继续导入外部依赖只会使要导入的jar包越来越多,最终还不一定可以导入成功,得不偿失,如下:

ad291341a654300cbaf4f3558c82ea51.png

3、导入json.jar成功后再次查看当前已导入的类文件如下

a04bb7e6fb67e19ccf7361d99853beae.png

4、在数据库SQL窗口执行以下脚本,创建java源码对象

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串单个节点值  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数组长度便于循环处理  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数组第index个元素  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;  }}
537a7cc8a6b98209f51a102e2d70527c.gif

创建成功后再次查询可以看到对应的class文件:

afd2ecbb0c2fc267359553c93069a083.png

5、利用步骤4创建的class创建function(或procedure),在此为了使其跟目前数据库已存在的json处理方法区分开,我们创建一个package,如下:

537a7cc8a6b98209f51a102e2d70527c.gif
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;/
537a7cc8a6b98209f51a102e2d70527c.gif

创建成功后可以查看包说明和主体:

991606c024e09a035883fd65a0bd7ee2.png
24dae2801cc3db180038f04cea3b34f8.png

6、测试

①简单json测试

fcf0d0245680976878d7c31d0ef4840c.png
c3b890c5302bbf5390eb2f3cea4aa209.png
e4ff4d2212196a26962e3019fac23aaa.png

②解析复杂json

2b28f8ad87702adae9cd5cdff436cbe8.png

至此,我们就可以很轻松的就取到json串中任意节点的值(如果节点值为数组则可以先计算数组长度再进行loop循环处理,或直接用getarrval方法取指定数组元素的值)。

方法2:安装开源组件PL/JSON

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

eb51ea4f157c5f9ddeb4c5b43a77bb12.png

优点:安装方便,解析方法较专业;缺点:新增数据库对象较多,短期学习成本较高。文档很详细,在此不再赘述。

尊重他人劳动成果,转载请注明本文链接:http://www.cnblogs.com/mobeiyan/p/6810243.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用`JSON.parseObject`解析复杂类型时,需要注意以下几点: 1. 确定要解析JSON字符串格式是否符合要求,例如是否符合对应的Java对象结构。 2. 创建对应的Java对象,确保它的属性结构与JSON字符串一致。 3. 使用`JSON.parseObject`方法进行解析,将JSON字符串换为Java对象。 下面是一个示例,演示如何使用`JSON.parseObject`解析复杂类型的JSON字符串: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; public class Main { public static void main(String[] args) { String jsonString = "{\"name\":\"John\",\"age\":30,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\"}}"; // 解析JSON字符串为Java对象 JSONObject jsonObject = JSON.parseObject(jsonString); // 获取属性值 String name = jsonObject.getString("name"); int age = jsonObject.getIntValue("age"); // 解析嵌套的复杂类型属性 JSONObject addressObject = jsonObject.getJSONObject("address"); String street = addressObject.getString("street"); String city = addressObject.getString("city"); // 打印解析结果 System.out.println("Name: " + name); System.out.println("Age: " + age); System.out.println("Street: " + street); System.out.println("City: " + city); } } ``` 在上面的示例中,我们首先定义了一个包含嵌套对象的JSON字符串。然后使用`JSON.parseObject`方法将其解析为`JSONObject`对象。接下来,我们使用`getString`和`getIntValue`方法获取简单类型的属性值,使用`getJSONObject`方法获取嵌套对象的属性值。最后,我们打印解析结果。 注意:在使用`JSON.parseObject`解析复杂类型时,需要确保JSON字符串的格式正确,且Java对象的属性结构与JSON字符串一致。另外,引入Fastjson库可以方便地进行JSON解析操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值