【问题标题】:Convert from ResultSet to JSON Object从 ResultSet 转换为 JSON 对象
【发布时间】:2019-10-28 04:17:57
【问题描述】:

我正在尝试将 ResultSet 转换为 JSON 对象。我已经设法获得了一个 JSON Array 对象。有没有办法可以将 JSON 对象转换为 JSON 数组,或者直接从 ResultSet 转换为 JSON 对象?

我尝试遵循以下链接中的以下建议。 How can I turn a JSONArray into a JSONObject?

但是我现在得到的JSON对象是这样的:

{"data":[{"patient_key":80},{"eng_surname":"CAN"},{"eng_givename":"NOT"}....]}

我希望有这样的 API 调用:

{       "patientKey": 88,
        "hkid": " U0500574",
        "engSurname": "CAN",
        "engGivename": "NOT ", ....}

有什么方法可以得到我想要的结果?

这就是我转换为 JSON 数组的方式。

public static JSONArray convertToJSONArray(ResultSet resultSet)
            throws Exception {
        JSONArray jsonArray = new JSONArray();
        while (resultSet.next()) {
            int total_rows = resultSet.getMetaData().getColumnCount();
            for (int i = 0; i < total_rows; i++) {
                JSONObject obj = new JSONObject();
                obj.put(resultSet.getMetaData().getColumnLabel(i + 1)
                        .toLowerCase(), resultSet.getObject(i + 1));
                jsonArray.put(obj);
            }
        }
        return jsonArray;
    }

【问题讨论】:

    标签: java json resultset


    【解决方案1】:

    我刚刚在问题中管理了您的两行功能。请告诉我它是否有效。那我可以告诉你问题出在哪里!

        public static JSONArray convertToJSONArray(ResultSet resultSet)
                throws Exception {
            JSONArray jsonArray = new JSONArray();
            while (resultSet.next()) {
                JSONObject obj = new JSONObject();
                int total_rows = resultSet.getMetaData().getColumnCount();
                for (int i = 0; i < total_rows; i++) {
                    obj.put(resultSet.getMetaData().getColumnLabel(i + 1)
                            .toLowerCase(), resultSet.getObject(i + 1));
    
                }
                jsonArray.put(obj);
            }
            return jsonArray;
        }
    

    【讨论】:

    • 是的,这行得通!似乎只是从 for 循环中移出 JSONObject,并在最后一步将其添加到输出数组中会有所帮助!
    • 是的。问题是,当您尝试向 json 对象添加新字段时,它会创建一个新对象。所以我设法在循环外创建对象,并在所有添加字段的迭代完成后将其添加到数组中。
    • 应该将total_rows 改为total_columns
    【解决方案2】:

    试试这个实现 -

    import org.json.JSONArray;
    import org.json.JSONObject;
    import org.json.JSONException;
    
    import java.sql.SQLException;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    
    public class ResultSetConverter {
      public static JSONArray convert( ResultSet rs )
        throws SQLException, JSONException
      {
        JSONArray json = new JSONArray();
        ResultSetMetaData rsmd = rs.getMetaData();
    
        while(rs.next()) {
          int numColumns = rsmd.getColumnCount();
          JSONObject obj = new JSONObject();
    
          for (int i=1; i<numColumns+1; i++) {
            String column_name = rsmd.getColumnName(i);
    
            if(rsmd.getColumnType(i)==java.sql.Types.ARRAY){
             obj.put(column_name, rs.getArray(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.BIGINT){
             obj.put(column_name, rs.getInt(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.BOOLEAN){
             obj.put(column_name, rs.getBoolean(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.BLOB){
             obj.put(column_name, rs.getBlob(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.DOUBLE){
             obj.put(column_name, rs.getDouble(column_name)); 
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.FLOAT){
             obj.put(column_name, rs.getFloat(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.INTEGER){
             obj.put(column_name, rs.getInt(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.NVARCHAR){
             obj.put(column_name, rs.getNString(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.VARCHAR){
             obj.put(column_name, rs.getString(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.TINYINT){
             obj.put(column_name, rs.getInt(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.SMALLINT){
             obj.put(column_name, rs.getInt(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.DATE){
             obj.put(column_name, rs.getDate(column_name));
            }
            else if(rsmd.getColumnType(i)==java.sql.Types.TIMESTAMP){
            obj.put(column_name, rs.getTimestamp(column_name));   
            }
            else{
             obj.put(column_name, rs.getObject(column_name));
            }
          }
    
          json.put(obj);
        }
    
        return json;
      }
    }
    

    【讨论】:

    • 这只是转换成 JSONArray 吗?
    【解决方案3】:

    您可以为结果创建模型并将其转换为 JSON 字符串。使用 GSON 类。

    Gson gson = new Gson();
    String json = gson.toJson(user);
    

    How to convert Java object to JSON String - Gson Java/JSON Serialization Example

    参考上面的内容。您可以将其解析为任何对象。

    如果您使用 java8 使用流进行列表操作

    Stream In Java

    【讨论】:

    • 我也在检查这个方法。但是,由于某些字段可能为空。这会是个问题吗?
    • 我设法修改了我当前的方法,将 ResultSet 转换为 JSONObject。但是,我遇到了另一个问题。我需要将另一个 ResultSet 添加到当前的 JSONObject 中。我尝试使用.put 方法,但它给了我这个:"patientPhones":[{"phone_id":42}, {"phone_type_cd":"O"},{"country_cd":"852"},... 我需要的是这个:"patientPhones": [{"phoneId": 88, "phoneTypeCd": "H",... 我该怎么办?希望你能明白我的意思。
    【解决方案4】:

    如果为此使用第三方库是一个选项,您可以使用jOOQ's JSON export capabilities。您不必使用整个 jOOQ 来使用它,只需编写:

    // Keep this logic
    try (ResultSet rs = s.executeQuery()) {
    
        // ctx is the jOOQ DSLContext.
        // Optionally pass a JSONFormat parameter to get a different desired output
        System.out.println(ctx.fetch(rs).formatJSON(jsonFormat));
    }
    

    (免责声明:我为 jOOQ 背后的公司工作)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多