我正在处理文件中的大量JSON数据,每个JSON对象都有一个类似的数组
field28436": [{
"id": "C28679",
"value": "Dutch"
}, {
"id": "C28963",
"value": "English"
}, {
"id": "C28966",
"value": "French"
}, {
"id": "C28968",
"value": "German"
}]
我需要将其存储在单列中的oracle数据库中。请提出一种数据类型或将其存储在单个列中的方式。我正在使用JAVA解析JSON。 例如,如果我将此值解析为键,那么使用哈希映射的值对如何将其存储在单个列中?有可能吗?
答案 0 :(得分:0)
如果您100%确定长度不会超过4000字节,请使用varchar2
列。否则,请使用CLOB或BLOB列。
在任何情况下,您都应该使用CHECK约束“增强”该列,以验证该值是有效的JSON,例如:
create table my_table
(
id integer primary key,
data clob,
constraint validate_json CHECK (data IS JSON)
);
Oracle建议改用BLOB
列,以避免CLOB
使用的多字节字符集的开销。但是,这使得从Java(或任何SQL客户端)内部处理JSON变得更加复杂。
要存储这样的值,请使用PreparedStatement
并使用setString()
方法。当前的Oracle驱动程序不再需要setClob()
来获取长字符串-至少不需要INSERT或UPDATE语句。
String jsonData = "field28436": [....]";
PreparedStatement pstmt = connection.prepareStatement(
"insert into my_table (id, data) values (?, ?)");
pstmt.setInt(1, 42);
pstmt.setString(2, jsonData);
pstmt.executeUpdate();
要读取数据,将使用类似的内容:
PreparedStatement pstmt = connection.prepareStatement("select data from my_table where id = ?");
pstmt.setInt(1, 42);
ResultSet rs = psmt.executeQuery();
if (rs.next()) {
String jsonData = rs.getString(1);
}
有关更多信息,我建议阅读JSON Developer's Guide
答案 1 :(得分:0)
在这种情况下,我不得不将json消息存储在表的一列中。我们使用了CLOB数据类型,效果很好