在前文中讲到了如何使用JSON标准库解析json串,参考:

Oracle解析复杂json的方法(转)

现补充一篇使用GSON库在Oracle中解析复杂json的方法。

GSON串的使用教程参考官方文档及

Gson使用一(Gson)

Gson使用二(GsonBuilder)

Gson使用三(集合的处理,一对多处理)

Gson使用四(TypeAdapter)

这一系列教程挺不错的,不过都使用了JavaBean,个人没有在Oracle里面直接使用JavaBean,GSON库提供了丰富的JsonElement处理方法。

1.执行loadjava命令导入处理json所需jar文件

loadjava -r   -f  -u  user/pwd@xxx.xxx.xxx.xxx:port/SID gson-2.8..jar

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

create or replace and compile java source named "Cux_Gson_Util" as

import 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.lang.Integer; 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@Amount
public 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/LINE
public 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; }
}

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

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; 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'; END Cux_Gson_Util_pkg;
/

4.

测试

SELECT cux_gson_util_pkg.getval('{"AA":"BB"}', 'AA') FROM DUAL;

结果
BB

SELECT cux_18_gson_util_pkg.getarrval('[{"AA":"BB"}]', 0) FROM DUAL;

结果

{"AA":"BB"}

SELECT cux_gson_util_pkg.getjsonvalue('[{"AA":"BB"}]', '0@AA') FROM DUAL;

结果

BB

  

Oracle 使用GSON库解析复杂json串的更多相关文章

  1. jsoncpp解析非json串

    转自:https://www.cnblogs.com/huojing/articles/5927488.html 由于Jsoncpp解析非法json时,会自动容错成字符类型.对字符类型取下标时,会触发 ...

  2. golang使用simplejson库解析复杂json

    cnblogs原创 golang自带的json解析库encoding/json提供了json字符串到json对象的相互转换,在json字符串比较简单的情况下还是挺好用的,但是当json字符串比较复杂或 ...

  3. gson在java和json串之间的应用

    public class JsonToJavaUtil { /** * 将json转成成javaBean对象 * * @param <T> * 返回类型 * @param json * 字 ...

  4. JMeter获取复杂的JSON串中的参数的值

    大家好,这篇博文中主要是介绍怎么用JMeter的BeanShell去获取复杂的JSON串中的某个参数的值,这将 便于我们用JMeter做出更完美的自动化测试: 首先有这样一个json串: { &quo ...

  5. 使用GSON和泛型解析约定格式的JSON串(转)

    时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...

  6. 开源 JSON 库解析性能对比( Jackson / Json.simple / Gson )

    Json 已成为当前服务器与 web 应用之间数据传输的公认标准. 微服务及分布式架构经常会使用 Json 来传输此类文件,因为这已经是 webAPI 的事实标准. 不过正如许多我们习以为常的事情一样 ...

  7. SpringMVC Jackson 库解析 json 串属性名大小写自动转换问题

    问题描述 在项目开发中,当实体类和表中定义的某个字段为 RMBPrice,首字母是大写的,sql 查询出来的列名也是大写的 RMBPrice,但是使用 jquery 的 ajax 返回请求响应时却出错 ...

  8. [转]用Gson来解析Json数据

    转自太阳尚远的博客:http://blog.yeqianfeng.me/2016/03/02/use_gson_to_parse_json/ 在我们实际开发中像Json和XML这两种格式的数据是最常见 ...

  9. JSON 串 自定义解析字段

    我们有时候会只需要j一个很长的json串中的少数的key value ,这个时候我们不会特意去建立一个object 来映射属性,这个时候我们可以应用 gson的JsonParser  来解析json串 ...

随机推荐

  1. Unity中的 原生插件/平台交互 原理

    http://blog.csdn.net/u010019717/article/details/78451660 声明:  内容摘录自:  http://gad.qq.com/article/deta ...

  2. iOS xcode创建静态库封装自己的SDK及使用

    https://www.cnblogs.com/JustForHappy/p/5773039.html 一,静态库和动态库的区别在这里就不说了,个人感觉如果是自己封装提供别人下载的话应该是静态库比较方 ...

  3. Python入门之Python中的logging模块

    基本用法 下面的代码展示了logging最基本的用法. import logging import sys # 获取logger实例,如果参数为空则返回root logger logger = log ...

  4. bzoj1635 / P2879 [USACO07JAN]区间统计Tallest Cow

    P2879 [USACO07JAN]区间统计Tallest Cow 差分 对于每个限制$(l,r)$,我们建立一个差分数组$a[i]$ 使$a[l+1]--,a[r]++$,表示$(l,r)$区间内的 ...

  5. 20145105 《Java程序设计》实验五总结

    实验五 JAVA网络编程 一.实验内容 用老师给的代码,实现服务器和客户端 和结对同学实现服务器与客户端的连接 客户端输入数据并加密,将密文发送给服务器,服务器接收密文并解密 二.实验步骤 用老师给的 ...

  6. Email移动的原理

    1.从数据库中得到被移动邮件的uid: 2.选择移动邮件所属folder,即SelectFolder; 3.调用copymessage(path,vmime::net::messageset::byU ...

  7. ubuntu下交叉编译ffmpeg

    环境:ubuntu16.04 交叉编译器版本:4.8.3 依赖x264,lame x264: 1.wget ftp://ftp.videolan.org/pub/x264/snapshots/last ...

  8. firefox、chrome的DNS缓存清除方法

    通过设置hosts文件可以强制指定域名对应的IP,当修改hosts文件,想要浏览器生效,最直接的方法关闭浏览器后重新开启:如果不想重启浏览器,只需要清空浏览器的DNS缓存即可. 清空DNS缓存在chr ...

  9. [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  10. H5本地存储一

    localStorage(本地存储),可以长期存储数据,没有时间限制,一天,一年,两年甚至更长,数据都可以使用.sessionStorage(会话存储),只有在浏览器被关闭之前使用,创建另一个页面时同 ...