需要帮助Jackson进行故障排除

时间:2020-03-20 15:02:05

标签: java 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());
    }

我知道为什么会这样(因为每次新启动都会进行静态初始化,然后我一次又一次地写入所有哈希图的文件),但是我不知道如何解决此问题。我想将新对添加到现有的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->获取用户请求->将此请求(“键值”对)写入本地哈希图->将哈希图(或每对分别为hmm)写入json文件。然后,当应用再次启动时:使用保存的请求从此json文件初始化哈希图->获取新的用户请求->将新请求添加到json文件。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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