Как сохранить данные с помощью gson в файле json?

20

В моем веб-приложении мне удается отображать данные в таблице html с помощью mybatis. Теперь я хочу сохранить записи таблицы Mysql в json файле и создать массив пользователей, я использовал Gson, проблема в том, что только одна запись была сохранена в файле. Благодарю.
Вот результат в 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();
  • 0
    потому что вы пишете в тот же файл в каждой итерации цикла. Вам нужно записать список в файл, а не каждый элемент.
  • 0
    если я вас понимаю, я перевожу строку "JsonWriter writer = new JsonWriter (new FileWriter (" C: \\ file.json "));" до строки для, но тот же результат
Показать ещё 3 комментария
Теги:
java-ee

3 ответа

41
Лучший ответ

Вы пишете всех пользователей в том же файле C:\\file.json чтобы только последняя итерация цикла была сохранена.

Вы можете преобразовать объект List<User> в json и записать его один раз (нужный цикл)

Пример:

try (Writer writer = new FileWriter("Output.json")) {
    Gson gson = new GsonBuilder().create();
    gson.toJson(users, writer);
}
  • 2
    спасибо за ответ, у меня были все пользователи в файле json, но почему обратная косая черта со строками. Мне не нужна обратная косая черта. "[{\" id \ ": 1, \" name \ ": \" Nancy \ "}, {\" id \ ": 2, \" detail \ ": \" Mike \ "}]"
  • 0
    Если вы сохраните его как полный объект без изменения строки, вы можете легко преобразовать его обратно в ваш объект, но это зависит от вашей миссии
Показать ещё 5 комментариев
1

Ранее я использовал outputStream.writeObject и Serializable с помощью записи/чтения по умолчанию для сохранения данных объекта. Из-за проблем с устойчивостью кода я был после чего-то другого. Это результат. Этот BufferedWriter является обязательным, иначе скорость записи снижается 8 раз. Обратите внимание, что декларация UTF-8, которая по умолчанию кодирует Json. Не уверен, что это не безопасно.

Пример:

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

где Тип, например:

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

Быстрое исправление кода:

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

Однако в том случае, если ваш класс User выглядит следующим образом:

public class User {
    String id;
    String name;
}

Тогда вам не нужно закодировать адаптер, так как Gson может автоматически генерировать код JSON для класса, в котором есть только примитивы (ints, Strings и т.д.). Таким образом, ваш код будет выглядеть как @roy-shmuli, но только если вы опустите данные и сохраните только массив, поскольку List может быть полностью сгенерирован без адаптера. Созданный код JSON будет выглядеть так:

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

Надеюсь, это поможет новичкам.

  • 0
    Любая идея о добавлении данных в этот файл JSON каждый раз?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню