繁体   English   中英

需要帮助解决杰克逊的问题

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM