Estoy convirtiendo el conjunto de resultados a JSON utilizando el siguiente enfoque y tratando de encontrar la manera de manejar null
el valor basado en el escenario se describe a continuación:
Cuando ejecuto la siguiente consulta SQL (que se utiliza en el código de abajo) en Oracle SQL Developer:
SELECT SQLQUERY FROM EMP WHERE id = 6
, Me sale el siguiente resultado:
Employee State of Residence Employee Count
1 (null) 1400
2 AL 1200
3 MS 6700
4 WT 4
Como se ha visto anteriormente, para los datos anteriores devueltos por la consulta SQL anterior, el código Java a continuación se convirtiéndola en la siguiente 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"
}
]
Así que, básicamente, no mostrar el Employee State of Residence
nombre de la columna en la respuesta JSON para Empleado Conde 1400
anterior, ya que de null
.¿Cómo puedo asegurar que en caso de null
valor, se muestra el nombre de la columna con tal vez una cadena vacía? O debería preguntar a la persona base de datos para devolver algo si es 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();
}
Las siguientes declaraciones de registro están imprimiendo la siguiente:
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
Este es el resultado de una limitación en JSONObject. Es necesario colocar un JSONObject.NULL con el fin de ver una entrada en su objeto JSON. Me gustaría tratar de modificar su código a la siguiente:
} 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);
}
}
Ahora bien, esto podría ser un poco diferente dependiendo de qué biblioteca JSON y la versión que está utilizando. Siéntase libre de incluir esos detalles en su pregunta.