我正在使用以下方法将resultset转换为JSON,并试图根据下面描述的场景找出如何处理null
值:
当我在Oracle SQL developer中运行以下SQL查询(在下面的代码中使用)时:
从EMP WHERE id=6
中选择SQLQUERY,得到以下结果:
Employee State of Residence Employee Count
1 (null) 1400
2 AL 1200
3 MS 6700
4 WT 4
如上所述,对于由上述SQL查询返回的上述数据,下面的Java代码将其转换为以下JSON:
[{
"Employee Count": " 1400"
},
{
"Employee Count": " 1200",
"Employee State of Residence": "AL"
},
{
"Employee Count": " 6700",
"Employee State of Residence": "MS"
},
{
"Employee Count": " 4",
"Employee State of Residence": "WT"
}
]
因此,基本上,它没有在上面的雇员计数1400
的JSON响应中显示雇员居住状态
列名,因为它是null
。如何确保在null
值的情况下,它显示的列名可能是一个空字符串?或者,如果它是null
,我应该要求数据库人员返回一些东西吗?
@Override
public String getData(Integer id) throws DaoException {
DataSource ds = null;
Connection conn = null;
PreparedStatement pstmt = null;
PreparedStatement pstmtNew = null;
ResultSet rs = null;
ResultSet rsNew = null;
JSONArray json = new JSONArray();
try {
ds = jdbcTemplate.getDataSource();
conn = ds.getConnection();
pstmt = conn.prepareStatement("SELECT SQLQUERY FROM EMP WHERE id = ?");
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
rs.next();
String sqlQuery = rs.getString("SQLQUERY");
pstmtNew = conn.prepareStatement(sqlQuery);
rsNew = pstmtNew.executeQuery();
ResultSetMetaData rsmd = rsNew.getMetaData();
int cols = rsmd.getColumnCount();
logger.info("Total Column Count "+rsmd.getColumnCount());
logger.info("The query fetched %d columns\n",cols);
logger.info("These columns are: ");
for (int i=1;i<=cols;i++) {
String colName = rsmd.getColumnName(i);
String colType = rsmd.getColumnTypeName(i);
logger.info(colName+" of type "+colType);
}
while(rsNew.next()) {
JSONObject obj = new JSONObject();
for (int i=1;i<=cols;i++) {
String column_name = rsmd.getColumnName(i);
if (rsmd.getColumnType(i) == java.sql.Types.ARRAY) {
obj.put(column_name, rsNew.getArray(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.BIGINT) {
obj.put(column_name, rsNew.getInt(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.BOOLEAN) {
obj.put(column_name, rsNew.getBoolean(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.BLOB) {
obj.put(column_name, rsNew.getBlob(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.DOUBLE) {
obj.put(column_name, rsNew.getDouble(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.FLOAT) {
obj.put(column_name, rsNew.getFloat(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.INTEGER) {
obj.put(column_name, rsNew.getInt(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.NVARCHAR) {
obj.put(column_name, rsNew.getNString(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.VARCHAR) {
obj.put(column_name, rsNew.getString(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.TINYINT) {
obj.put(column_name, rsNew.getInt(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.SMALLINT) {
obj.put(column_name, rsNew.getInt(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.DATE) {
obj.put(column_name, rsNew.getDate(column_name));
} else if (rsmd.getColumnType(i) == java.sql.Types.TIMESTAMP) {
obj.put(column_name, rsNew.getTimestamp(column_name));
} else {
obj.put(column_name, rsNew.getObject(column_name));
}
}
json.put(obj);
}
}
catch(Throwable th) {
throw new DaoException(th.getMessage(), th);
}
finally {
if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }}
if (rsNew != null) { try { rsNew.close(); } catch (SQLException e) { e.printStackTrace(); }}
if (pstmt != null) { try { pstmt.close(); } catch(SQLException sqe) { sqe.printStackTrace(); }}
if (pstmtNew != null) { try { pstmtNew.close(); } catch(SQLException sqe) { sqe.printStackTrace(); }}
if (conn != null) { try { conn.close(); } catch (SQLException sqle) { sqle.printStackTrace(); }}
}
return json.toString();
}
以下日志语句正在打印以下内容:
logger.info("Total Column Count "+rsmd.getColumnCount());
logger.info("The query fetched %d columns\n",cols);
logger.info("These columns are: ");
Total Column Count 2
The query fetched %d columns
These columns are:
Employee State of Residence of type VARCHAR2
Employee Count of type VARCHAR2
这是JSONObject中一个限制的结果。您需要放置一个JSONObject.null来查看JSON对象中的一个条目。我将尝试将您的代码修改为以下内容:
} else {
Object object = rsNew.getObject(column_name);
if (object != null) {
obj.put(column_name, rsNew.getObject(column_name));
} else {
obj.put(column_name, JSONObject.NULL);
}
}
现在,根据您使用的JSON库和版本,这可能会有一些不同。请在你的问题中包括这些细节。
问题内容: 以下代码使用和将转换为JSON字符串。 有没有更快的方法? 有没有一种方法可以使用更少的内存? 问题答案: 由于JIT编译器只是分支和基本测试,因此它可能会使其变得非常快。您可以通过对回调进行HashMap查找来使其更加优雅,但我怀疑这样做会更快。至于记忆,这是非常苗条的。 我以某种方式怀疑此代码实际上是内存或性能的关键瓶颈。您有真正的理由尝试对其进行优化吗?
我有一个需求,我正在将数据从API转换为JSON格式。API的输出最初是XML格式的,因此我使用XMLReader控制器服务读取XML数据,并使用JSONRecordSetWriter控制器服务将其转换为Apache Nifi 1.9.2中的JSON格式。
我试图将文件从ECDIC转换为ASCII格式,遇到了一个有趣的问题。这些文件包含固定长度的记录,其中一些字段是带符号的二进制整数(在记录布局中描述为B4),以及长精度数值(在记录布局中描述为L8)。我已经能够毫无问题地转换字符数据,但我不确定如何转换这些数值。下面描述了原始系统的参考手册(IBM5110)中的字段。
下面是我使用jackson转换为pojo的json响应- 代码: 我收到以下例外: 线程“main”com . faster XML . Jackson . databind . jsonmappingexception中出现异常:无法从字符串值(“”)实例化类型为[simple type,class com . test . sample . paymenttyperpons]的值;没有单字符串
问题内容: 我有一个场景。 必需的输入和输出是JSON。 我需要一些转换代码或最好是xslt类型的语言才能将json从一种格式转换为另一种格式。该变压器也需要快速运行,因为转换将即时进行。 编辑 我没有收到INPUT对象的定义,它可能会在运行时更改。但是如果需要,我可以将类用于OUTPUT对象。我尝试以 json- > xml-> xslt-> xml-> json的方式进行此操作 ,但 此刻 每
我想转换我的嵌套json消息,并使用Jolt规范只获取必需的文件- 我的输入JSON: 低于我的规格输出,这不是预期的- 我尝试了很多选择,但国籍不是我预期的输出。请在这里帮助颠簸转换