1
votes

Convertir de ResultSet en objet JSON

J'essaye de convertir ResultSet en objet JSON. J'ai déjà réussi à obtenir un objet JSON Array. Existe-t-il un moyen de convertir un objet JSON en JSON Array, ou de ResultSet en objet JSON directement?

J'ai essayé de suivre les suggestions ci-dessous dans le lien ci-dessous. Comment puis-je transformer un JSONArray en JSONObject?

Mais l'objet JSON que je reçois maintenant est comme ceci:

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

Je souhaite avoir quelque chose comme ça pour les appels API:

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

Est-il possible d'obtenir le résultat souhaité?

C'est ainsi que j'ai converti en JSON Array.

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


0 commentaires

4 Réponses :


0
votes

Essayez cette implémentation -

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


1 commentaires

S'agit-il simplement de la conversion en JSONArray?



0
votes

Vous pouvez créer un modèle pour le résultat et le convertir en une chaîne JSON. en utilisant la classe GSON.

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

Comment convertir un objet Java en chaîne JSON - Exemple de sérialisation Gson Java / JSON

prenez la référence ci-dessus. vous pouvez l'analyser dans n'importe quel objet.

Si vous utilisez java8, utilisez des flux pour la manipulation de liste

Diffuser en Java


2 commentaires

Je vérifie aussi cette méthode. Cependant, car il y a des chances que certains champs soient nuls. Serait-ce un problème?


J'ai réussi à modifier ma méthode actuelle pour convertir ResultSet en JSONObject. Cependant, je rencontre un autre problème. Je dois ajouter un autre ResultSet dans un JSONObject actuel. J'ai essayé d'utiliser la méthode .put , mais cela me donne ceci: "patientPhones":[{"phone_id":42}, {"phone_type_cd":"O"},{"country_cd":"852"},... ce que je besoin est le suivant: "patientPhones": [{"phoneId": 88, "phoneTypeCd": "H",... Comment dois - je faire? J'espère que vous pouvez comprendre ce que je veux dire.



0
votes

Je viens de gérer deux lignes de votre fonction dans la question. S'il vous plaît dites-moi si cela fonctionne. alors je peux vous dire quel était le problème!

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


2 commentaires

Oui, cela fonctionne! On dirait que simplement déplacer le JSONObject de la boucle for, et l'ajouter au tableau de sortie dans la dernière étape aidera!


Oui. Le problème était que chaque fois que vous essayez d'ajouter un nouveau champ à votre objet json, cela crée de nouveaux objets. J'ai donc réussi à créer un objet en dehors de la boucle et à l'ajouter au tableau une fois toutes les itérations d'ajout de champs terminées.



0
votes

Si l'utilisation d'une bibliothèque tierce pour cela est une option, vous pouvez utiliser les capacités d'exportation JSON de jOOQ . Vous n'avez pas besoin d'utiliser l'intégralité de jOOQ pour l'utiliser, écrivez simplement:

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

(Avertissement: je travaille pour l'entreprise derrière jOOQ)


0 commentaires