oracle数据库导入gson包

 

数据库发送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" 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.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@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;

    }

    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;

猜你喜欢

转载自www.cnblogs.com/jiangxuzheng-0708/p/8980236.html
今日推荐