【问题标题】:Java: Query ResultSet to JSONJava:查询结果集到 JSON
【发布时间】:2018-11-21 17:04:07
【问题描述】:

通过以下代码向 Oracle DB 发送查询,并应将查询结果返回为JSON

    Connection conn ;
    try {

        Class.forName("oracle.jdbc.driver.OracleDriver"); 
        String url = "jdbc:oracle:thin:@localhost:1521:dbname";     
        conn = DriverManager.getConnection(url,"username","pwd");  

        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM table4 where ID = '5'");


        while (rs.next()) {
            String s = rs.getString("*");
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().write(s);

        }

        conn.close();


    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

但是,String s 的值始终为空。

我去过解决方案here,但它不适用于从表中选择*

【问题讨论】:

  • ResultSet 是列的集合,因此getString(...) 只会作用于一列。
  • @PaulBenn 那么如何在不一一提及的情况下返回所有列?
  • 问题24943894 已经解决了这个问题。在提出此类问题之前,最好先查看documentation - 请参阅getMetadata() 方法。
  • String s = rs.getString("*");这不起作用,您必须设置尽可能多的数据库表字段的变量,否则使用 java POJO 类

标签: java json resultset


【解决方案1】:

要输出 JSON,您需要先将数据累积到 List<Map<String, Object>>

使用ResultSetMetaData 获取列数和列名。

List<Map<String, Object>> rows = new ArrayList<>();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

while (rs.next()) {
      // Represent a row in DB. Key: Column name, Value: Column value
      Map<String, Object> row = new HashMap<>();
      for (int i = 1; i <= columnCount; i++) {
           // Note that the index is 1-based
           String colName = rsmd.getColumnName(i);
           Object colVal = rs.getObject(i);
           row.put(colName, colVal);
      }
      rows.add(row);
}

// Write the list of rows to output
// Recommend to use jackson-ObjectMapper to streaming json directly to outputstream:
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(response.getOutputStream(), rows);

要使用 Jackson ObjectMapper,请将依赖项添加到您的项目中:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.4</version>
</dependency>

【讨论】:

  • 在这种情况下,我应该在 List&lt;Map&lt;String, Object&gt;&gt; rows = new ArrayList&lt;&gt;(); 中使用的 是什么?
  • 在我的代码中阅读我的评论。每个映射代表 DB 中的一行。 Map key 为列名,Map value 为列值
  • 请替换“Object colVal = rsmd.getObject(i);”用“对象 colVal = rs.getObject(i);”
  • 谢谢@MichaelBelyakov
【解决方案2】:

这里的问题不在于转换为 JSON(在您的帖子中链接的this question 中已解决),而是您调用 ResultSet 的方式。查看它的documentation,我们可以看到getString 方法可以采用column indexcolumn label,但没有提及诸如* 之类的通配符搜索。如果您对数据库中的列一无所知,可以使用getMetadata() 方法获取有关列的信息(包括列名)。

【讨论】:

  • 你能提出一个基于上述代码的代码吗?更改为getMetaData 后我仍然有空值。
  • 这在很大程度上取决于您希望如何格式化行。您希望您的列值为Object[] 吗?你想要他们的toString 表示吗?我假设您的问题出现是因为直接将其转换为 JSON 还不够?
  • toString 将用于将值转换为 JSON。
猜你喜欢
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2016-09-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多