【发布时间】:2015-02-19 23:46:40
【问题描述】:
我从mySQL 服务器获取Resultset,并希望将其作为JSON 发送回客户端。
服务器写在Java EE..
我一直在寻找这个..但没有什么简单的.. 初级过程真的有那么难吗? 还是我的理解有什么问题?
【问题讨论】:
我从mySQL 服务器获取Resultset,并希望将其作为JSON 发送回客户端。
服务器写在Java EE..
我一直在寻找这个..但没有什么简单的.. 初级过程真的有那么难吗? 还是我的理解有什么问题?
【问题讨论】:
https://gist.github.com/mreynolds/603526
public String convertResultSetToJson(ResultSet resultSet) throws SQLException {
Joiner commaJoiner = Joiner.on(", \n");
StringBuilder builder = new StringBuilder();
builder.append("{ \"results\": [ ");
List<String> results = new ArrayList<String>();
while (resultSet.next()) {
List<String> resultBits = new ArrayList<String>();
ResultSetMetaData metaData = resultSet.getMetaData();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
StringBuilder resultBit = new StringBuilder();
String columnName = metaData.getColumnName(i);
resultBit.append("\"").append(columnName).append("\": \"").append(resultSet.getString(i)).append("\"");
resultBits.add(resultBit.toString());
}
results.add(" { " + commaJoiner.join(resultBits) + " } ");
}
builder.append(commaJoiner.join(results));
builder.append("] }");
return builder.toString();
}
【讨论】:
@SuppressWarnings("unchecked") //we use 3rd-party non-type-safe types...
public static String convertResultSetToJson(ResultSet resultSet) throws SQLException
{
JSONArray json = new JSONArray();
ResultSetMetaData metadata = resultSet.getMetaData();
int numColumns = metadata.getColumnCount();
while(resultSet.next()) //iterate rows
{
JSONObject obj = new JSONObject(); //extends HashMap
for (int i = 1; i <= numColumns; ++i) //iterate columns
{
String column_name = metadata.getColumnName(i);
obj.put(column_name, resultSet.getObject(column_name));
}
json.add(obj);
}
return json.toJSONString();
}
你可以轻松使用:JsonUtils.convertResultSetToJson(...)
从 Maven 中心获取 JAR,
<!-- https://mvnrepository.com/artifact/com.ohadr/ohadr.commons -->
<dependency>
<groupId>com.ohadr</groupId>
<artifactId>ohadr.commons</artifactId>
<version>0.3</version>
</dependency>
【讨论】:
您可以使用org.json 提供的JSONObject。
将org.json.JSONObject 导入到您的文件中。然后您可以将结果集转换如下:
jsonObject = new JSONObject();
jsonObject.put(key,resultSet.getInt(resultSet.findColumn(columname)));
return jsonObject.toString();
因此,如果您想将名称为 NO_OF_DAYS 且值为 3 的列返回到 json 对象中,例如 {"days" : "3"},您可以将代码编写为:
jsonObject.put("days",resultSet.getInt(resultSet.findColumn("NO_OF_DAYS")));
【讨论】:
使用 Jackson 进行 JSON 处理。如果您将结果转换为 POJO,只需使 POJO Jackson 兼容(例如,getter 将自动序列化或使用 @JsonProperty。
将 pojo 转换为 JSON 的示例:
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(somePojo);
如果您不将结果转换为 POJO,则可以使用名为 ObjectNode 的 JsonNode 子类。
例子:
public String convert(ResultSet rs) {
ObjectNode node = new ObjectMapper().createObjectNode();
node.put("fieldName", rs.getString("columnName"));
return node.toString(); // this is proper JSON
}
然而,最常见和最干净的方法是从您的函数返回一个 POJO(无论是 EJB 还是 REST 服务或类似服务),然后让框架为您将其转换为 JSON(通常框架使用 Jackson) .这意味着您的方法只是返回某种与 Jackson 兼容的模型对象。
【讨论】: