将ResultSet转换为JSON的最佳方法是什么?

4
我从MySQL服务器获取Resultset,并希望将其作为JSON发送回客户端。服务器是用Java EE编写的。
我一直在寻找这个问题的解决方法,但没有简单明了的方法。这个基本过程真的需要这么难吗?或者我的理解有什么错误吗?
4个回答

5
使用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兼容的。

1

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();
}

发布一个链接和裸代码,即使正确,也不是一个充分的答案。应该包括解释为什么代码和链接中的材料能够充分回答问题。如果没有这些信息,你的答案将被标记为低质量,就像这个一样。 - Jeff Zeitlin
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来具有类似问题的读者更有用。请编辑您的答案,添加一些解释,包括您所做的假设。 - Toby Speight
此代码仅能处理字符串类型的值。对于JSON,它无法正确地处理日期、数字、时间或布尔值。 - Rodney P. Barbati

0
您可以使用由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")));

0
@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();
}

源代码:https://github.com/OhadR/ohadr.common/blob/master/src/main/java/com/ohadr/common/utils/JsonUtils.java

您可以轻松使用: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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接