[英]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.