很抱歉,可能是新手问题,我正在尝试在为工作中的项目做贡献的同时学习Java。实际上,代码是Groovy(&我们正在使用Grails),但假定为此目的是相同的。
我正在尝试将JDBC ResultSet转换为JSON(以发送到前端)。从博客获得了以下代码:
// Convert JDBC ResultSet to JSON string
public static JSONArray convertToJSON(ResultSet resultSet)
throws Exception {
JSONArray jsonArray = new JSONArray();
ResultSetMetaData metaData = resultSet.getMetaData(); // Result set meta data
int total_columns = metaData.getColumnCount(); // Number of columns in the row
while (resultSet.next()) { // Take each row from the result set
JSONObject obj = new JSONObject();
for (int i = 0; i < total_columns; i++) {
obj.put(metaData.getColumnLabel(i + 1)
.toLowerCase(), resultSet.getObject(i + 1));
}
jsonArray.put(obj);
}
return jsonArray.toString(); // Return as JSON string
}
(我相信)这会给我一个JSON结构,其数据位于JSON的根/顶部。我想将其移至子字段(例如“数据”),然后在根级别使用另外一对键/值对。我将如何修改代码来做到这一点? (我可以将几个额外的值作为参数传递)
谢谢。
答案 0 :(得分:1)
您可以做类似的事情
JSONObject rootObject = new JsonObject();
rootObject.put("data", jsonArray);
这将使您像对待键值对一样对待JSON,并应完成您的要求。
此外,您可能希望使用ObjectMapper
将对象转换为JSON。这将允许您使用类似objectMapper.writeValueAsString(resultSet)
答案 1 :(得分:1)
我认为您提供的代码段中有错误,因为您的签名将JSONArray
声明为返回类型,但是您返回了String
,无论如何,这是我的建议:
public static JSONObject convertToJSON(ResultSet resultSet)
throws Exception {
JSONObject root = new JSONObject();
JSONArray jsonArray = new JSONArray();
root.put("data", jsonArray);
ResultSetMetaData metaData = resultSet.getMetaData(); // Result set meta data
int total_columns = metaData.getColumnCount(); // Number of columns in the row
while (resultSet.next()) { // Take each row from the result set
JSONObject obj = new JSONObject();
for (int i = 0; i < total_columns; i++) {
obj.put(metaData.getColumnLabel(i + 1)
.toLowerCase(), resultSet.getObject(i + 1));
}
jsonArray.put(obj);
}
return root;
}
答案 2 :(得分:1)
因为这是一个Groovy问题,所以您可以使代码更具Groovy;-)
static String convertToJSON(ResultSet resultSet) throws Exception {
def metaData = resultSet.metaData // Result set meta data
def result = []
while (resultSet.next()) { // Take each row from the result set
result << (1..metaData.columnCount).collectEntries {
[metaData.getColumnLabel(it).toLowerCase(), resultSet.getObject(it)]
}
}
return new JsonBuilder(result).toString() // Return as JSON string
}