【问题标题】:How to read INFORMIX Table JSON Column in Java如何在 Java 中读取 INFORMIX 表 JSON 列
【发布时间】:2016-06-04 14:14:17
【问题描述】:

我想阅读使用 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]

提前致谢

【问题讨论】:

    标签: java jdbc informix


    【解决方案1】:

    在您的 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"}
    

    修改demo 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 字符串,这看起来很奇怪,但也许你仍然可以使用它。或者您可以修改地图部分以生成您需要的输出。 或者,将其转换为 JSON 并从结果集中以字符串形式获取值可能更简单。 在您的情况下,由于您已经使用JSON,您可以将其作为字符串检索。

    【讨论】:

    • 感谢 Luis,将安装并查看它。
    • 虽然我使用了示例,但我仍然无法获取示例中提到的 JSON 数据作为字符串。
    • @Anand 我添加了一个基于演示的代码示例。也许它可以提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    相关资源
    最近更新 更多