Oracle 使用GSON库解析复杂json串
在前文中讲到了如何使用JSON标准库解析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串的更多相关文章
- jsoncpp解析非json串
转自:https://www.cnblogs.com/huojing/articles/5927488.html 由于Jsoncpp解析非法json时,会自动容错成字符类型.对字符类型取下标时,会触发 ...
- golang使用simplejson库解析复杂json
cnblogs原创 golang自带的json解析库encoding/json提供了json字符串到json对象的相互转换,在json字符串比较简单的情况下还是挺好用的,但是当json字符串比较复杂或 ...
- gson在java和json串之间的应用
public class JsonToJavaUtil { /** * 将json转成成javaBean对象 * * @param <T> * 返回类型 * @param json * 字 ...
- JMeter获取复杂的JSON串中的参数的值
大家好,这篇博文中主要是介绍怎么用JMeter的BeanShell去获取复杂的JSON串中的某个参数的值,这将 便于我们用JMeter做出更完美的自动化测试: 首先有这样一个json串: { &quo ...
- 使用GSON和泛型解析约定格式的JSON串(转)
时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...
- 开源 JSON 库解析性能对比( Jackson / Json.simple / Gson )
Json 已成为当前服务器与 web 应用之间数据传输的公认标准. 微服务及分布式架构经常会使用 Json 来传输此类文件,因为这已经是 webAPI 的事实标准. 不过正如许多我们习以为常的事情一样 ...
- SpringMVC Jackson 库解析 json 串属性名大小写自动转换问题
问题描述 在项目开发中,当实体类和表中定义的某个字段为 RMBPrice,首字母是大写的,sql 查询出来的列名也是大写的 RMBPrice,但是使用 jquery 的 ajax 返回请求响应时却出错 ...
- [转]用Gson来解析Json数据
转自太阳尚远的博客:http://blog.yeqianfeng.me/2016/03/02/use_gson_to_parse_json/ 在我们实际开发中像Json和XML这两种格式的数据是最常见 ...
- JSON 串 自定义解析字段
我们有时候会只需要j一个很长的json串中的少数的key value ,这个时候我们不会特意去建立一个object 来映射属性,这个时候我们可以应用 gson的JsonParser 来解析json串 ...
随机推荐
- mysql explicit_defaults_for_timestamp 变量的作用
mysql 中有这样的一个默认行为,如果一行数据中某些列被更新了,如果这一行中有timestamp类型的列,那么么这个timestamp列的数据 也会被自动更新到 更新操作所发生的那个时间点:这个操作 ...
- linux查看内存free
free 加参数-b/k//m/g,以b.k.m.g的大小显示结果,默认以k显示 [root@oldboy ~]# free total used free shared buffers cached ...
- Jsp获取Java的对象(JavaBean)
Jsp获取Java的对象(JavaBean) Java代码片段: AuthReqBean authRep=new AuthReqBean(); authRep.setUserCode(usercode ...
- 根据wsdl文件,Web工程自动生成webservice客户端调用
根据wsdl文件,Web工程自动生成webservice客户端调用 1,工具:带有webservice插件的eclips 2,步骤: (1),新建一个Web工程:WSDLTest (2),浏览器访问W ...
- Django 搭建后台 favicon.ico 文件操作
Django 搭建后台 favicon.ico 文件操作 使用 django 搭建后台服务器,我用的是 django 1.8 版本以上的,就是路由不是 url 而是 path 的,这里有一个关于fav ...
- 03: JavaScript基础
目录: 参考W3school 1.1 变量 1.2 JavaScript中数据类型 1.3 JavaScript中的两种for循环 1.4 条件语句:if.switch.while 1.5 break ...
- 20145334赵文豪网络对抗Web安全基础实践
1.SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的. 对于SQL注入攻击的防范,我觉 ...
- 字符编码之间的相互转换 UTF8与GBK(转载)
转载自http://www.cnblogs.com/azraelly/archive/2012/06/21/2558360.html UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 ...
- Python3基础 __delattr__ 在一个属性被删除时的行为
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Eclipse中离线安装ADT插件详细教程
在搭建Android开发环境的时候,我们需要为Eclipse安装ADT(Android Development Tools)插件,这个插件可以为用户提供一个强大的Android集成开发环境.通过给Ec ...