java - 如何在 Java 中读取 INFORMIX 表 JSON 列

标签 java jdbc informix

我想使用 JDBC 调用读取在 java 中定义为 JSON 的 INFORMIX 表列。这是我在 INFORMIX 12.10 中的表架构

create row type fullname_t
    (
    first varchar(20),
    middle varchar(20),
    last varchar(20)
    );
create row type person_t
    (
    name fullname_t,
    age integer
    );
create row type phone_t
    (
    type varchar(10),
    contact varchar(20)
    );
create table teachers  (
id integer,
person person_t,
dept varchar(20),
hobbies LIST(varchar(255) not null),
phones LIST(phone_t not null),
address "informix".json not null  );

示例数据

DELETE FROM teachers WHERE 1=1;
INSERT INTO teachers VALUES (100, "ROW(ROW('Bill', 'William', 'Smith'), 27)", "physics", "LIST{'Cricket', 'Soccer'}","LIST{ROW('FIXED', '08023456789'), ROW('MOBILE', '9035252525')}",'{type: "HOME", addrLine1: "123525", city: "Bangalore", zipCode: "560001", state: "KA", country: "INDIA"}'::JSON);
INSERT INTO teachers VALUES (101, "ROW(ROW('John', 'Martin', 'Smith'), 30)", "math", "LIST{'Tennis', 'Baseball'}","LIST{ROW('FIXED', '1-800-CALL-SUPPORT')}",'{type: "HOME", addrLine1: "51st A cross 5th Main", city: "Chennai", zipCode: "909404", state: "TN", country: "INDIA"}'::JSON);

我能够读取自定义 ROW 类型,例如人员、电话,但 JSON 类型的地址除外。

感谢任何将 JSON 对象读取为字符串的帮助/建议,随后,我可以使用 Jackson API 来转换 JSON 字符串。

需要自定义 SQLData 映射,但不确定如何处理 JSON

JDBC 选择的输出

Teacher [id=100, person=Person [name=Fullname [first=Bill, middle=William, last=Smith], age=27], dept=physics, hobbies=[Cricket, Soccer], phones=[Phone [type=FIXED, contact=08023456789], Phone [type=MOBILE, contact=9035252525]], address=null]
Teacher [id=101, person=Person [name=Fullname [first=John, middle=Martin, last=Smith], age=30], dept=math, hobbies=[Tennis, Baseball], phones=[Phone [type=FIXED, contact=1-800-CALL-SUPPORT]], address=null]

提前致谢

最佳答案

在您的 Informix JDBC 驱动程序安装位置(版本 4.10 ,不确定以前的版本),您应该有一个“demo/bson/”目录,其中包含一个演示 java 程序,该程序应该有助于解释如何处理 informix bson 和json 数据类型:Examples in the bson directory

编辑1:

我创建了下表并插入了一些值。我使用了 BSON 类型,但我们可以转换为 JSON ,反之亦然:

CREATE TABLE
(
    id SERIAL
  , stuff BSON
);

INSERT INTO myspace values (0, '{"val1" : "123", "val2" : "uno"}'::JSON::BSON);
INSERT INTO myspace values (0, '{"val1" : "456", "val2" : "duo"}'::JSON::BSON);
INSERT INTO myspace values (0, '{"val1" : "879", "val2" : "trio"}'::JSON::BSON);
INSERT INTO myspace values (0, '{"val1" : "987", "val2" : "quad"}'::JSON::BSON);


SELECT id, stuff::JSON AS stuff FROM myspace;

id     1
stuff  {"val1":"123","val2":"uno"}

id     2
stuff  {"val1":"456","val2":"duo"}

id     3
stuff  {"val1":"789","val2":"trio"}

id     4
stuff  {"val1":"987","val2":"quad"}

修改演示java程序(抱歉代码丑陋):

IfxDataSource ifxDs = null;
Connection conn1 = null;
Statement stmt1 = null;
IfxResultSet rs = null; 
IfxBSONObject bsonObject = null;

try
{
    // Create a DataSource instance
    System.out.println("INFO: create DataSource");
    ifxDs = new IfxDataSource();
    ifxDs.setServerName("MYIFXSERVER");
    ifxDs.setDatabaseName("doluis");
    ifxDs.setIfxIFXHOST("192.168.56.101");
    ifxDs.setPortNumber(15000);
    ifxDs.setUser("YYYYY");
    ifxDs.setPassword("XXXXXXX");

    // get connection
    System.out.println("INFO: Get connection");
    conn1 = ifxDs.getConnection();            
    System.out.println("INFO: Database version  ..... : " + conn1.getMetaData().getDatabaseProductVersion());
    System.out.println("INFO: JDBC Driver Version ... : " + IfxDriver.getJDBCVersion());


    try
    {
        // Create a Statement
        stmt1 = conn1.createStatement();

        // Do some DML
        System.out.println("INFO:  myspace");
        String sql = "SELECT * FROM myspace";
        System.out.println("INFO: [QUERY] " + sql);
        rs = (IfxResultSet) stmt1.executeQuery(sql);

        int i = 1;          
        while (rs.next()) 
        {
            //* get the BSON object using informix extension to PreparedStatement.
            bsonObject = rs.getIfxBSONObject("stuff"); 
            //* calling IfxBSONObject.toString() to deserialize the object for readable string;
            System.out.println("INFO: [RESULT:" + i + "] id:" + rs.getInt("id") + " | stuff:" + bsonObject.toString());
            Map<String, Object> map = bsonObject.toMap();
            for (Map.Entry<String, Object> entry : map.entrySet())
            {
                System.out.println("\t" +"key:value -> " +entry.getKey() + ":" + entry.getValue());
            }
            i++;
        }
        // Close result set and stmt1 
        rs.close();
        stmt1.close();
        // Create a Statement
        stmt1 = conn1.createStatement();

        // Do some DML
        System.out.println("INFO:  myspace");
        sql = "SELECT id, stuff::JSON AS stuff FROM myspace";
        System.out.println("INFO: [QUERY] " + sql);
        rs = (IfxResultSet) stmt1.executeQuery(sql);

        i = 1;          
        while (rs.next()) 
        {
            // Columns stuff was casted to JSON, we can get it as a string
            System.out.println("INFO: [RESULT:" + i + "] id:" + rs.getInt("id") + " | stuff:" + rs.getString("stuff"));
            i++;
        }
    }
    catch (SQLException sqlex)
    {
        System.err.println("ERROR: Code : " + sqlex.getErrorCode() + ", Message : " + sqlex.getMessage());
    }
    finally
    {
        rs.close();
        rs = null;                
        stmt1.close();
        stmt1 = null;                
    }

}
catch (Exception ex)
{
    System.out.println("FAILED: upps, something went wrong");
    ex.printStackTrace();
}
finally
{
    if (conn1 != null)
    {
        try
        {
            conn1.close();
            conn1 = null;
        }
        catch (SQLException sqlex)
        {
            System.err.println("ERROR: Code : " + sqlex.getErrorCode() + ", Message : " + sqlex.getMessage());
        }
    }
}

我得到以下输出:

INFO: create DataSource
INFO: Get connection
INFO: Database version  ..... : 12.10.FC6DE
INFO: JDBC Driver Version ... : 4.10.JC6DE
INFO:  myspace
INFO: [QUERY] SELECT * FROM myspace
INFO: [RESULT:1] id:1 | stuff:IfxBSONObject { "val1" : "123" , "val2" : "uno" }
    key:value -> val1:123
    key:value -> val2:uno
INFO: [RESULT:2] id:2 | stuff:IfxBSONObject { "val1" : "456" , "val2" : "duo" }
    key:value -> val1:456
    key:value -> val2:duo
INFO: [RESULT:3] id:3 | stuff:IfxBSONObject { "val1" : "789" , "val2" : "trio" }
    key:value -> val1:789
    key:value -> val2:trio
INFO: [RESULT:4] id:4 | stuff:IfxBSONObject { "val1" : "987" , "val2" : "quad" }
    key:value -> val1:987
    key:value -> val2:quad
INFO:  myspace
INFO: [QUERY] SELECT id, stuff::JSON AS stuff FROM myspace
INFO: [RESULT:1] id:1 | stuff:{"val1":"123","val2":"uno"}
INFO: [RESULT:2] id:2 | stuff:{"val1":"456","val2":"duo"}
INFO: [RESULT:3] id:3 | stuff:{"val1":"789","val2":"trio"}
INFO: [RESULT:4] id:4 | stuff:{"val1":"987","val2":"quad"}

因此,IfxBSONObject 中的 toString() 方法会附加 IfxBSONObject 字符串,这看起来很奇怪,但也许您仍然可以使用它。或者您可以修改 map 部分以生成您需要的输出。 或者也许更简单的是转换为 JSON 并从结果集中获取字符串形式的值。 就您而言,由于您已经使用 JSON,因此您可以将其作为字符串检索。

关于java - 如何在 Java 中读取 INFORMIX 表 JSON 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37451873/

相关文章:

java - 如何使用新 API 在 hadoop 中设置队列名称

java - 退出 JSF 流

java - 使用java从数据库下载附件

Informix future

java - 消息字符集

java - 使用任务 :annotation-driven tag in Spring MVC 时出现 SAXParseException

java - 连接到 JDBC 事务的开始

java - 重构 JDBC 函数

sql-server - 带有 FIRST 选项的 Informix 子查询

c# - Informix 和 .NET 的时间和日期时间格式