webentwicklung-frage-antwort-db.com.de

Wie speichert man Daten mit dem Gson in einer Json-Datei

In meiner Webanwendung gelingt es mir, Daten mit mybatis in der HTML-Tabelle anzuzeigen. Jetzt möchte ich die Datensätze der Mysql-Tabelle in einer Json-Datei speichern und ein Array von Benutzern erstellen. Ich habe Gson verwendet. Das Problem ist, dass nur ein Datensatz in der Datei gespeichert ist. Vielen Dank.
Hier das Ergebnis in 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

Sie schreiben alle Benutzer in derselben Datei C:\\file.json, sodass nur die letzte Iteration der Schleife gespeichert wird.

Sie können das Objekt List<User> in json konvertieren und es einmal schreiben (keine erforderliche Schleife)

Beispiel:

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

Ich habe vorher outputStream.writeObject und Serializable mit Standard-Writer/Reader zum Speichern von Objektdaten verwendet. Aufgrund von Problemen mit der Code-Nachhaltigkeit habe ich etwas anderes gesucht. Das ist das Ergebnis. Dieser BufferedWriter ist obligatorisch, andernfalls sinkt die Schreibgeschwindigkeit um das Achtfache. Beachten Sie die UTF-8-Deklaration, die Standardcodierung von Json ist. Nicht sicher, ob es nicht sicher ist, dass es sicher ist.

Beispiel:

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

wo Typ zum Beispiel:

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

Schnelle Korrektur für Ihren 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();
}

Wenn Ihre Benutzerklasse jedoch so aussieht:

public class User {
    String id;
    String name;
}

Dann müssen Sie den Adapter nicht codieren, da Gson den JSON-Code automatisch für eine Klasse generieren kann, die nur Grundelemente (Ints, Strings usw.) enthält. Ihr Code würde also als @ roy-shmuli aussehen, aber nur, wenn Sie die Daten weglassen und nur das Array beibehalten, da List ohne Adapter vollständig generiert werden kann. Der generierte JSON-Code würde folgendermaßen aussehen:

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

Ich hoffe es hilft den Anfängern.

1
nessa.gp