我想使用 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/