[英]Need help troubleshooting with Jackson
我有一个 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());
}
我明白为什么会发生这种情况(因为每次新发布都会进行静态初始化,然后我一次又一次地写入所有 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 -> 获取用户请求 -> 将此请求(对“键值”)写入本地哈希图 -> 将哈希图(或每对单独?嗯)写入 json 文件。 然后当应用程序再次启动时:使用保存的请求从这个 json 文件初始化 hashmap -> 获取新用户请求 -> 将新请求添加到 json 文件。
所以有点我需要将每一对一一写入文件(不是所有地图),但是如何?
最终,您的问题在这里: new FileWriter(new File("games.json"), true))
。
FileWriter
构造函数是FileWriter(File file, boolean append)
因此您每次写入时都将数据附加到该文件。
你想要的只是FileWriter(File file)
,它默认覆盖文件。 这假设您的games
地图始终是最新的,并且所有数据都在内存中。
这有点低效率,因为每次进行更改时您都会覆盖整个文件,但这似乎不是很多数据,所以我认为这不应该是一个问题。 如果事实证明这是频繁更新的大量数据,您可能需要考虑使用数据库而不是 JSON 文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.