web-dev-qa-db-fra.com

Comment sauvegarder des données avec gson dans un fichier json?

Dans mon application Web, je réussis à afficher les données dans une table HTML à l'aide de mybatis. Maintenant, je veux enregistrer les enregistrements de la table Mysql dans un fichier json et créer un tableau d’utilisateurs. J’ai utilisé Gson. Le problème est qu’un seul enregistrement est enregistré dans le fichier. Merci.
Voici le résultat en file.json:

{"data":
 [
 {"id":2,"Name":"Mike"}
 ]
}

servlet.Java

SqlSession session = MyBatisSqlSessionFactory.getSession();
List<User> users = session.selectList("dao.UserDao.findAll");
for (User u : users) {
    Gson gson = new Gson();
    try {
        JsonWriter  writer = new JsonWriter(new FileWriter("C:\\file.json"));
        writer.beginObject();
        writer.name("data");
        writer.beginArray();
        writer.beginObject();
        writer.name("id").value(t.getId());
        writer.name("name").value(t.getNom());
        writer.endObject();
        writer.endArray();
        writer.endObject();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

session.close();
23
mak_doni

Vous écrivez tous les utilisateurs dans le même fichier C:\\file.json, ainsi que la dernière itération de la boucle enregistrée.

Vous pouvez convertir l'objet List<User> en json et l'écrire une fois (pas de boucle nécessaire)

Exemple:

try (Writer writer = new FileWriter("Output.json")) {
    Gson gson = new GsonBuilder().create();
    gson.toJson(users, writer);
}
49
Roy Shmuli

J'utilisais précédemment outputStream.writeObject et Serializable avec le graveur/lecteur par défaut pour la sauvegarde des données d'objet. En raison de problèmes liés à la durabilité du code, j'ai cherché autre chose. C'est le résultat. Ce BufferedWriter est obligatoire, sinon la vitesse d’écriture chute 8 fois. Notez que la déclaration UTF-8 qui est le codage par défaut de Json . Pas sûr de ne pas déclarer que c'est sécuritaire.

Exemple:

private void saveJson(Object object, Type type, String directory, String fileName) {

    File file = new File(getApplicationContext().getDir(directory, Context.MODE_PRIVATE),
            fileName);
    OutputStream outputStream = null;
    Gson gson = new GsonBuilder().enableComplexMapKeySerialization().setPrettyPrinting()
            .create();
    try {
        outputStream = new FileOutputStream(file);
        BufferedWriter bufferedWriter;
        if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream,
                    StandardCharsets.UTF_8));
        } else {
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        }

        gson.toJson(object, type, bufferedWriter);
        bufferedWriter.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
        if (DEBUG) Log.e(saveJson, "saveUserData, FileNotFoundException e: '" + e + "'");
    } catch (IOException e) {
        e.printStackTrace();
        if (DEBUG) Log.e(saveJson, "saveUserData, IOException e: '" + e + "'");
    } finally {
        if (outputStream != null) {
            try {
                outputStream.flush();
                outputStream.close();
            } catch (IOException e) {
                if (DEBUG) Log.e(saveJson, "saveUserData, finally, e: '" + e + "'");
            }
        }
    }

}


private Object loadJson(Type type,  String directory, String fileName) {
    Object jsonData = null;

    File file = new File(getApplicationContext().getDir(directory, Context.MODE_PRIVATE),
            fileName);
    InputStream inputStream = null;
    Gson gson = new GsonBuilder().enableComplexMapKeySerialization().setPrettyPrinting()
            .create();
    try {
        inputStream = new FileInputStream(file);
        InputStreamReader streamReader;
        if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
            streamReader = new InputStreamReader(inputStream,
                    StandardCharsets.UTF_8);
        } else {
            streamReader = new InputStreamReader(inputStream, "UTF-8");
        }

        jsonData = gson.fromJson(streamReader, type);
        streamReader.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
        if (DEBUG) Log.e(TAG, "loadJson, FileNotFoundException e: '" + e + "'");
    } catch (IOException e) {
        e.printStackTrace();
        if (DEBUG) Log.e(TAG, "loadJson, IOException e: '" + e + "'");
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                if (DEBUG) Log.e(TAG, "loadJson, finally, e: '" + e + "'");
            }
        }
    }
    return jsonData;
}

où Tapez par exemple:

Type type = new TypeToken<Map<String, Object>>() { }.getType();
4
sonavolob

Correction rapide de votre code:

SqlSession session = MyBatisSqlSessionFactory.getSession();
List<User> users = session.selectList("dao.UserDao.findAll");
try {
    JsonWriter writer = new JsonWriter(new FileWriter("C:\\file.json"));
    writer.beginObject();
    writer.name("data");
    writer.beginArray();
    for (User u : users) {
        writer.beginObject();
        writer.name("id").value(t.getId());
        writer.name("name").value(t.getNom());
        writer.endObject();
    }
    writer.endArray();
    writer.endObject();
    writer.close();
} catch (IOException e) {
    e.printStackTrace();
}

Cependant, dans le cas où votre classe d'utilisateurs ressemble à ceci:

public class User {
    String id;
    String name;
}

Ensuite, vous n'avez pas besoin de coder l'adaptateur, car Gson est capable de générer automatiquement le code JSON pour une classe qui n'a que des primitives (ints, Strings, etc.). Votre code ressemblera donc à @ roy-shmuli, mais uniquement si vous omettez les données et ne conservez que le tableau sous forme de liste pouvant être entièrement générée sans adaptateur. Le code JSON généré ressemblerait à ceci:

[
    {"id":1, "name": "Mike"},
    {"id":2, "name": "Lucy"}
]

J'espère que cela aide les débutants.

1
nessa.gp