Нужна помощь в устранении неполадок с Джексоном - PullRequest
2 голосов
/ 20 марта 2020

У меня есть HashMap, который я инициализирую один раз в блоке stati c из файла json. Затем я работаю со своим локальным HashMap, чтобы сохранить запросы пользователей.

static {
  TypeFactory typeFactory = mapper.getTypeFactory();
  MapType mapType = typeFactory.constructMapType(ConcurrentHashMap.class, String.class, GooglePlayGame.class);
  try {
       games = mapper.readValue(new File("games.json"), mapType);
        } catch (IOException e) {
          log.error(e.getMessage());
        }
    }

Когда я решу остановить приложение и запустить его снова, я могу добавить новую пару «ключ-значение» к этой карте, но когда я пытаюсь добавить изменения в мой json файл, все, что уже было в json файле, дублируется + новое значение. Этот код:

try(JsonGenerator g = mapper.getFactory().createGenerator(
                  new PrintWriter(new BufferedWriter(new FileWriter(new File("games.json"), true))))) {
    mapper.writeValue(g, games);
    } catch (IOException e) {
      log.error(e.getMessage());
    }

Я понял, почему это происходит (из-за инициализации stati c при каждом новом запуске, а затем я снова и снова записываю в файл все hashmap), но я не знаю, как это исправить , Я хочу добавить новые пары в существующий файл json.

Например: добавление первого запроса, все в порядке:

{"Machinarium":
   {"Title":"Machinarium",
    "Updated":"28 February, 2019",
    "Version":"2.5.6","Requirements":"4.1,
     "Contacts":"support@amanita-design.net"
}

Затем я перезапускаю приложение и получаю другой запрос, мой json файл теперь выглядит так:

{"Machinarium":
   {"Title":"Machinarium",
    "Updated":"28 February, 2019",
    "Version":"2.5.6","Requirements":"4.1,
     "Contacts":"support@amanita-design.net",
....
},
{"Machinarium":
   {"Title":"Machinarium",
    "Updated":"28 February, 2019",
    "Version":"2.5.6","Requirements":"4.1,
     "Contacts":"support@amanita-design.net",
....
},
"Samorost 3":
   {"Title":"Samorost 3",
    "Updated":"November 14, 2019",
     "Version":"1.0",
     "Requirements":"4.3,
...}

Как видите, здесь дубликат.

Итак, цель: создать HashMap -> получить запрос пользователя -> записать этот запрос (пара "ключ-значение") в локальный hashmap -> записать hashmap (или каждую пару отдельно? Хмм) в json файл. Затем, когда приложение запустится снова: инициализируйте hashmap из этого файла json с сохраненными запросами -> получите новый запрос пользователя -> добавьте новые запросы в файл json.

Так что мне нужно записать каждую пару по одной в файл (не всю карту), но как?

1 Ответ

1 голос
/ 20 марта 2020

В конечном счете, ваша проблема здесь: new FileWriter(new File("games.json"), true)).

Конструктор FileWriter равен FileWriter(File file, boolean append), поэтому вы добавляете данные в этот файл каждый раз, когда пишете.

Вместо этого вы просто хотите FileWriter(File file), который по умолчанию перезаписывает файл. Это предполагает, что ваша карта games всегда актуальна и содержит все данные в памяти.

Это немного менее эффективно, поскольку вы будете перезаписывать весь файл каждый раз, когда вносятся изменения, но вряд ли это будет много данных, поэтому я не думаю, что это должно быть проблемой. Если это оказывается очень большой объем данных, который часто обновляется, вы можете захотеть использовать базу данных вместо файла JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...