需要帮助Jackson进行故障排除

问题描述 投票:2回答:1

我有一个HashMap,它在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());
    }

我理解了为什么会这样(因为每次新启动都会进行静态初始化,然后我一次又一次地写入所有哈希图的文件),但是我不知道如何解决这个问题。我想将新对添加到现有的json文件中。

例如:添加第一个请求,一切正常:

{"Machinarium":
   {"Title":"Machinarium",
    "Updated":"28 February, 2019",
    "Version":"2.5.6","Requirements":"4.1,
     "Contacts":"[email protected]"
}

然后我重新启动应用程序并收到另一个请求,我的json文件现在看起来像:

{"Machinarium":
   {"Title":"Machinarium",
    "Updated":"28 February, 2019",
    "Version":"2.5.6","Requirements":"4.1,
     "Contacts":"[email protected]",
....
},
{"Machinarium":
   {"Title":"Machinarium",
    "Updated":"28 February, 2019",
    "Version":"2.5.6","Requirements":"4.1,
     "Contacts":"[email protected]",
....
},
"Samorost 3":
   {"Title":"Samorost 3",
    "Updated":"November 14, 2019",
     "Version":"1.0",
     "Requirements":"4.3,
...}

如您所见,此处重复。

所以目标是:创建HashMap->获取用户请求->将此请求(“键-值”对)写入本地hashmap->将hashmap(或每对分别为hmm)写入json文件。然后,当应用再次启动时:使用保存的请求从此json文件初始化哈希图->获取新的用户请求->将新请求添加到json文件。

所以,我需要一对一地写入文件(不是全部地图),但是如何?

java jackson
1个回答
0
投票

最终,您的问题在这里:new FileWriter(new File("games.json"), true))

FileWriter构造函数为FileWriter(File file, boolean append),因此您每次写入时都会将数据追加到该文件。

您想要的只是FileWriter(File file),默认情况下会覆盖该文件。假设您的games映射始终是最新的,并且所有数据都在内存中。

这有点低效率,因为每次进行更改时都会覆盖整个文件,但这似乎不是很多数据,所以我认为这不是要担心的问题。如果事实证明这是经常更新的大量数据,则您可能希望研究使用数据库而不是JSON文件。

© www.soinside.com 2019 - 2024. All rights reserved.