数据库发送webservice请求,接受json格式的时候,需要解析格式,引入解析json.jar包比较方便

1)首先我们确定要导入的json.jar包,这里推荐gson.jar,因为这个jar不依赖于其他jar,功能也很强大!

2)loadjava -r -f -u 用户名/密码@数据库地址:端口/数据库实例 gson.jar                   导入jar

dropjava -u 用户名/密码@数据库地址:端口/数据库实例 gson.jar                          删除导入的jar

3)这时候我们只是引入了gson.jar,我们还需要封装一个类,将我们需要的方法写进去

create or replace and compile java source named "Cux_Gson_Util" asimport com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.lang.Integer;
import java.sql.Clob;
import java.sql.SQLException;public class Cux_Gson_Util {public static boolean isJsonString(String json) {try {new JsonParser().parse(json);return true;} catch (JsonParseException e) {return false;} catch (NullPointerException e) {return false;} catch (Exception e) {return false;}}// 取json串单个节点值// json取值,有两种常见的异常,KEY不存在,空指针异常,数组型json,数组长度越界异常// 应该还是要按Exceptin处理,否则由于传参的数据错误的话,就发现不了,直接当空值返回了。// 不能返回空,应该在第一步数据校验里面直接抛出来。public static String getValue(String jsonStr, String nodeName) {String nodeValue = "";if (!isJsonString(jsonStr)) {nodeValue = "";} else {try {JsonParser jsonParser = new JsonParser();JsonObject obj = new JsonObject();obj = (JsonObject) jsonParser.parse(jsonStr);nodeValue = "";if (obj.get(nodeName) instanceof JsonObject) {nodeValue = obj.get(nodeName).toString();} else if (obj.get(nodeName) instanceof JsonArray) {nodeValue = obj.get(nodeName).toString();} else if (obj.get(nodeName) instanceof JsonPrimitive) {// Error toString will , the result will start and end with// "// nodeValue = obj.get(nodeName).toString();// 四种写法都可以// nodeValue = obj.get(nodeName).getAsString();// nodeValue = obj.getAsString();// nodeValue =// obj.get(nodeName).getAsJsonPrimitive().toString();nodeValue = obj.get(nodeName).getAsJsonPrimitive().getAsString();} else if (obj.get(nodeName) instanceof JsonNull) {nodeValue = "";} else {nodeValue = obj.get(nodeName).getAsJsonPrimitive().getAsString();}} catch (Exception e) {}}return nodeValue;}// 取json数组长度便于循环处理public static int getArrayLength(String jsonArrayStr) {int length = 0;if (isJsonString(jsonArrayStr)) {JsonArray jsonArr = new JsonParser().parse(jsonArrayStr).getAsJsonArray();length = jsonArr.size();} else {length = 0;}return length;}// 取json数组第index个元素public static String getArrayValue(String jsonStr, Integer index) {String nodeValue = "";if (isJsonString(jsonStr)) {JsonArray jsonArr = new JsonParser().parse(jsonStr).getAsJsonArray();// 此处不能用getAsString()或者getAsJsonPrimitive(),因为数组中的类型未知,需要先做空判断if (jsonArr.get(index) instanceof JsonNull) {nodeValue = "";} else {nodeValue = jsonArr.get(index).toString();}} else {nodeValue = null;}return nodeValue;}// 取json串下级节点值public static String getJsonValue(String jsonStr, String nodeName) {String nodeValue = "";if (isJsonString(jsonStr)) {JsonParser parser = new JsonParser();JsonElement jsonElement = parser.parse(jsonStr);if (jsonElement.isJsonNull()) {nodeValue = "";} else if (jsonElement.isJsonPrimitive()) {nodeValue = jsonElement.getAsJsonPrimitive().getAsString();} else if (jsonElement.isJsonObject()) {nodeValue = getJSONObjectValue(jsonElement.getAsJsonObject().toString(), nodeName);} else if (jsonElement.isJsonArray()) {nodeValue = getJSONArrayValue(jsonElement.getAsJsonArray().toString(), nodeName);} else {nodeValue = null;}}return nodeValue;}// 对于数组,以"@"作为分隔, index/nodeName形式,如 0@Amountpublic static String getJSONArrayValue(String jsonStr, String nodeName) {String nodeValue = "";JsonParser jsonParser = new JsonParser();JsonArray obj = jsonParser.parse(jsonStr).getAsJsonArray();int position = nodeName.indexOf("@");String objStr = nodeName.substring(0, position);int index = Integer.parseInt(objStr);String nodeStr = nodeName.substring(position + 1);// 此处未做数组越界异常判断,
nodeValue = getJsonValue(obj.get(index).toString(), nodeStr);return nodeValue;}// 参数nodeName,对于嵌套json以"/"作为分隔,比如HEADER/LINEpublic static String getJSONObjectValue(String jsonStr, String nodeName) {String nodeValue = null;JsonParser jsonParser = new JsonParser();JsonObject obj = jsonParser.parse(jsonStr).getAsJsonObject();int position = nodeName.indexOf("/");if (position == -1) {// 此处未做Key是否存在的检查,如果要做,应该将检查方法单独提前校验if (obj.get(nodeName) instanceof JsonObject) {// 此处可以直接用toString方法// nodeValue = obj.get(nodeName).toString();nodeValue = obj.get(nodeName).getAsJsonObject().getAsString();} else if (obj.get(nodeName) instanceof JsonArray) {// 此处可以直接用toString方法// nodeValue = obj.get(nodeName).toString();nodeValue = obj.get(nodeName).getAsJsonArray().getAsString();} else if (obj.get(nodeName) instanceof JsonPrimitive) {nodeValue = obj.get(nodeName).getAsJsonPrimitive().getAsString();} else if (obj.get(nodeName) instanceof JsonNull) {nodeValue = "";} else {nodeValue = "";}} else {String objStr = nodeName.substring(0, position);String nodeStr = nodeName.substring(position + 1);nodeValue = getJsonValue(obj.get(objStr).toString(), nodeStr);}return nodeValue;}public static String ClobToString(Clob clob) throws SQLException, IOException {String reString = "";Reader is = clob.getCharacterStream();// 得到流BufferedReader br = new BufferedReader(is);String s = br.readLine();StringBuffer sb = new StringBuffer();while (s != null) {// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
            sb.append(s);s = br.readLine();}reString = sb.toString();return reString;}public static String getClobArrayValue(Clob jsonStr, String str1, String str2) throws SQLException, IOException {return getValue(getValue(getArrayValue(ClobToString(jsonStr), 0), str1), str2);}public static int getClobLength(Clob jsonStr, String str1, String str2) throws SQLException, IOException {return getArrayLength(getValue(getValue(getArrayValue(ClobToString(jsonStr), 0), str1), str2));}public static String getClobArrayValue(Clob jsonStr, String str1, String str2, Integer index)throws SQLException, IOException {return getArrayValue(getValue(getValue(getArrayValue(ClobToString(jsonStr), 0), str1), str2), index);}
}

前面的代码是借鉴网上的,后面解析Clob类型的方法是我添加的,因为存在json字符串过长,超过2000个字符,string就无法解析了!

4)java类写好后,还需要写PKG,将java方法映射到存储过程上去

CREATE OR REPLACE PACKAGE Cux_Gson_Util_pkg AS
--// 取json串单个KEY值
FUNCTION getval(jsonstr VARCHAR2, nodename VARCHAR2) RETURN VARCHAR2;
--//取json数组第index个元素
FUNCTION getarrval(jsonarraystr VARCHAR2, index_num NUMBER) RETURN VARCHAR2;
--//取json数组长度便于循环处理
FUNCTION getarrlen(jsonarraystr VARCHAR2) RETURN NUMBER;

--// 取json串下级节点值
FUNCTION getjsonvalue(jsonarraystr VARCHAR2, nodename VARCHAR2)
RETURN VARCHAR2;

--// 对于数组,以"@"作为分隔, index/nodeName形式,如 0@Amount
FUNCTION getjsonarrayvalue(jsonarraystr VARCHAR2, nodename VARCHAR2)
RETURN VARCHAR2;

--// 参数nodeName,对于嵌套json以"/"作为分隔,比如HEADER/LINE
FUNCTION getjsonobjectvalue(jsonarraystr VARCHAR2, nodename VARCHAR2)
RETURN VARCHAR2;
--获取clob类型json的第一个值的str1的str2
function getclobarrayvalue(jsonStr Clob, str1 VARCHAR2, str2 VARCHAR2)
return varchar2;
function getcloblength(jsonStr Clob, str1 VARCHAR2, str2 VARCHAR2)
return NUMBER;
function getclobarrayvalue(jsonStr Clob,
str1 VARCHAR2,
str2 VARCHAR2,
index_num NUMBER) return varchar2;
END Cux_Gson_Util_pkg;
/
CREATE OR REPLACE PACKAGE BODY Cux_Gson_Util_pkg AS
FUNCTION getval(jsonstr VARCHAR2, nodename VARCHAR2) RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'Cux_Gson_Util.getValue(java.lang.String,java.lang.String) return java.lang.String';

FUNCTION getarrval(jsonarraystr VARCHAR2, index_num NUMBER) RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'Cux_Gson_Util.getArrayValue(java.lang.String, java.lang.Integer) return java.lang.String';

FUNCTION getarrlen(jsonarraystr VARCHAR2) RETURN NUMBER AS
LANGUAGE JAVA NAME 'Cux_Gson_Util.getArrayLength(java.lang.String) return java.lang.Integer';

FUNCTION getjsonvalue(jsonarraystr VARCHAR2, nodename VARCHAR2)
RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'Cux_Gson_Util.getJsonValue(java.lang.String,java.lang.String) return java.lang.String';

FUNCTION getjsonarrayvalue(jsonarraystr VARCHAR2, nodename VARCHAR2)
RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'Cux_Gson_Util.getJSONArrayValue(java.lang.String,java.lang.String) return java.lang.String';

FUNCTION getjsonobjectvalue(jsonarraystr VARCHAR2, nodename VARCHAR2)
RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'Cux_Gson_Util.getJSONObjectValue(java.lang.String,java.lang.String) return java.lang.String';
function getclobarrayvalue(jsonStr Clob, str1 VARCHAR2, str2 VARCHAR2)
return varchar2 as
LANGUAGE JAVA NAME 'Cux_Gson_Util.getClobArrayValue(java.sql.Clob,java.lang.String,java.lang.String) return java.lang.String';
function getcloblength(jsonStr Clob, str1 VARCHAR2, str2 VARCHAR2)
return NUMBER as
LANGUAGE JAVA NAME 'Cux_Gson_Util.getClobLength(java.sql.Clob,java.lang.String,java.lang.String) return java.lang.Integer';
function getclobarrayvalue(jsonStr Clob,
str1 VARCHAR2,
str2 VARCHAR2,
index_num NUMBER) return varchar2 as
LANGUAGE JAVA NAME 'Cux_Gson_Util.getClobArrayValue(java.sql.Clob,java.lang.String,java.lang.String,java.lang.Integer) return java.lang.String';
END Cux_Gson_Util_pkg;
/

5)最后我们就可以测试使用了

select cux_gson_util_pkg.getarrval(jsonarraystr => '[{" name ":" aaa "," age ":" 12"},{" name ":" bbb "," age ":" 13 "}]',index_num    => 0)from dual;

select cux_gson_util_pkg.getval(cux_gson_util_pkg.getarrval(jsonarraystr => '[{"name":"aaa","age":"12"},{"name":"bbb","age":"13"}]',index_num    => 0),'name')from dual;

转载于:https://www.cnblogs.com/jiangxuzheng-0708/p/8980236.html

oracle数据库导入gson包相关推荐

  1. Oracle数据库导入导出命令!

    oracle数据库导入导出命令! 转自:http://www.cnblogs.com/fjfzhkb/archive/2007/09/03/879807.html Oracle数据导入导出imp/ex ...

  2. oracle数据库导入txt,oracle数据库导入TXT文件方法介绍

    客户端连接数据库导入 1. 安装有oracle客户端,配好监听. 2. 以oracle数据库app用户的表user_svc_info为例 CREATE TABLE USER_SVC_INFO( PHO ...

  3. oracle 不能导入sql语句,oracle数据库导入.dmp脚本的sql 语句

    一.更改数据库管理员sys/system密码 1.运行到C盘根目录 2.输入:SET ORACLE_SID = 你的SID名称 3.输入:sqlplus /nolog 4.输入:connect /as ...

  4. oracle数据库导出数据6,Oracle数据库导入导出方法汇总

    Oracle数据库导入导出方法: 1.使用命令行: 数据导出: 1.将数据库TEST完全导出,用户名system密码manager导出到D:\daochu.dmp中 exp system/manage ...

  5. Oracle数据库导入csv文件(sqlldr命令行)

    1.说明 Oracle数据库导入csv文件, 当csv文件较小时, 可以使用数据库管理工具, 比如DBevaer导入到数据库, 当csv文件很大时, 可以使用Oracle提供的sqlldr命令行工具, ...

  6. 【Oracle数据库驱动架包 ojdbc5.jar ojdbc6.jar】

    免费获取Oracle数据库驱动架包:ojdbc5 .6.jar 由于用到了Oracle数据库的驱动架包 ,看到论坛里面好多都是要积分的,本人本着资源共享的原则, 特意将架包共享出来,从而解决部分急需之 ...

  7. oracle 数据库导入语句,oracle 数据库导入导出语句

    1 将数据库test完全导出.用户名system/manager导出到D:daochu.dmp 代码如下: exp system/manager@test file=d:daochu.dmp full ...

  8. Oracle数据库导入导出 imp/exp备份还原

    Oracle数据导入导出imp/exp Oracle数据导入导出imp/exp 在cmd的dos命令提示符下执行,而不是在sqlplus里面,但是格式一定要类似于: imp/exp 用户名/密码@se ...

  9. oracle 数据库导入导出文章

    原文出自: http://www.cnblogs.com/fjfzhkb/archive/2007/09/03/879807.html Oracle数据导入导出imp/exp 功能:Oracle数据导 ...

最新文章

  1. 华农软件工程实验报告_华南农业大学15年软件工程复习提纲
  2. 06.正则表达式基本知识
  3. 山东旅游学院2021高考成绩查询,2021年山东旅游职业学院录取查询入口,高考录取结果查询网址登录...
  4. intx update task - IB_IBINTX_UPDATE
  5. 傅里叶变换表_Numpy库小抄表!主要语法和代码都在这里啦
  6. 机器学习之无监督学习——聚类
  7. java ee cdi_Java EE CDI ConversationScoped示例
  8. 扩大博士研究生招生规模!
  9. 计算机考试演示文稿模板,2018职称计算机考试PowerPoint习题10
  10. 从0开始架构一个IOS程序—— 05— NavigationBar 搭建首页面
  11. mysql innodb事务中 出现_MySql InnoDB事务死锁问题
  12. win10设置禁止系统更新
  13. Linux正在更新缓存卡住,Linux 进程卡住了怎么办?
  14. VS2008下, Microsoft AJAX 组件开发单独js智能提示
  15. html5中drag//drop拖曳效果的用法
  16. java数据结构编程问题_Java语言程序设计与数据结构第十一版(基础篇)第一章编程练习题答案...
  17. OMRON软件安装与配置
  18. 解决Heritrix镜像方式存储路径中文乱码的解决方案
  19. 平板连接远程Linux,如何从Android平板电脑远程控制Ubuntu | MOS86
  20. 玩一玩Spring容器(可视化笔记02)

热门文章

  1. how to connect to eduroam
  2. cocos2d-x第一天:环境的搭建
  3. snapmix与Bi-Tempered Logistic Loss(自制数据集纯度不高效果好)
  4. 【java】创建一个Frame,字体的颜色可以用按钮改变
  5. java的queue类,java集合类深入分析之Queue篇
  6. 抽取CNN网络任意层的特征,VGG模型fine-tuning实践
  7. python字符串驼峰转换_将字符串转换为驼峰格式
  8. 像科学家一样思考python_像计算机科学家一样思考Python (第2版) 中文pdf完整版
  9. html5pc转微信小程序,微信电脑版终于支持小程序 新版PC版微信实测
  10. python实现最大公共子序列