Изменить значение ключа в файле JSON

357
14 сентября 2017, 15:26

Читаю данные из json с помощью Gson. И в одном активити я хочу изменить значения ключа одного обьекта. С помощью сеттера поставляю то значение которое мне нужно и в другом активити она показывается в recyclerview превосходно. Но после перезагрузки приложения все эти данные которые я поставил исчезают. Вопрос: как сохранить все мои изменения в этом локальном json файле?

private Category loadJSONFromDirectory() {
    Gson gson=new Gson();
    BufferedReader bf= null;
    Category category=null;
    try {
        bf= new BufferedReader(new FileReader(json));
        category=gson.fromJson(bf,Category.class);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }finally {
        if(bf!=null)
            try {
                bf.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    return category;
}

private void setFavoriteJson(boolean action) {
    Category file = loadJSONFromDirectory();
    for (Catsub catsub : file.getCatsub()) {
        for (Subcategory subcat : catsub.getSubcategories()) {
            if (subcat.getDataAll() != null) {
                for (DataAll data : subcat.getDataAll()) {
                    if (data.getId().equals(companyId)) {
                        data.setFavorites(action);
                    }
                }
            }
        }
    }
}
Answer 1

Если я правильно понимаю Ваше описание и Ваш код, то Вы десериализуете json (это просто текстовые данные) в объект Category (это уже Java-объект в куче) и далее работаете именно с Java-объектом, а не с прочитанными Вами текстовыми данными.

Для того, чтобы сохранить изменения, Вам нужно после внесённых изменений сериализовать объект обратно в json и сохранить в файл.

private void saveJsonToFile(String filePath, Category data) {
    File file = new File(filePath);
    Gson gson = new Gson();
    FileWriter writer = null;
    try {
        writer = new FileWriter(file, false);
        gson.toJson(data, writer);
    } catch (IOException e) {
        e.printStackTrace();
    }
    finally {
        if(writer != null) {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Кстати, Вы можете создать один объект Gson и использовать его везде, где это необходимо, а не создавать его каждый раз для каждой операции. Вот здесь говорят, что это даже полезно.

READ ALSO
Android: Не парсится JSON и не выводятся в listview

Android: Не парсится JSON и не выводятся в listview

Я пишу REST клиент, для парсинга JSON'a, я использую для этого Retrofit 2

278
ajax работа с всплывающими окнами

ajax работа с всплывающими окнами

Есть раскрывающееся по наведению курсора меню, работа которого протестированаЕсть список

276
Удаление файлов в папке по дате Java (JSP)

Удаление файлов в папке по дате Java (JSP)

Не получается удалить старые файлы в папке через JSP по датеИмеется класс для удаления файлов (DeleteFile

285