【问题标题】:Jackson doesn't append new JSON object to exisiting Json fileJackson 不会将新的 JSON 对象附加到现有的 Json 文件中
【发布时间】:2021-07-23 23:44:53
【问题描述】:

我正在尝试构建一个 Springboot 应用程序,该应用程序允许从 Postman 插入 Json 对象并将其保存到包含其他数据的现有 json 文件中。我是杰克逊的新手,所以也许我错过了什么?

这就是我的 json 文件的样子:

[
   {
      "Name":"After Dark",
      "Author":"Haruki Murakami"
   },
   {
      "Name":"It",
      "Author":"Stephen King"
   }
]

这是我尝试过的:

@PostMapping("/insertBook")
public void insertBook(@RequestBody Book book)  {
    File booksJsonFile = Paths.get(this.getClass().getResource("/books.json").toURI()).toFile();
    objectMapper.writeValue(booksJsonFile, book);
}

它会插入到一个空文件中,但它不会附加到现有的 json 文件中。

我也试过这个:

@PostMapping("/insertBook")
public void insertBook(@RequestBody Book book) throws URISyntaxException {

    try {
        File file = Paths.get(this.getClass().getResource("/books.json").toURI()).toFile();
        FileWriter fileWriter = new FileWriter(file, true);
        SequenceWriter seqWriter = objectMapper.writer().writeValuesAsArray(fileWriter);
        seqWriter.write(book);

        seqWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是我从 Postman 发送的:

我需要使用其他东西来达到我想要的结果吗? 我会感谢你的帮助。

【问题讨论】:

    标签: java spring-boot maven jackson postman


    【解决方案1】:

    我已尝试根据您的代码重现您的问题,我得出以下结论:

    1. 您不能直接修改resources 下的文件。这里是explanation why

    2. 我设法将新的JSON 附加到文件中(使用您的方法但在本地保存文件),但这可能不是您所期望的(json 结构已损坏):

    [
       {
          "Name":"After Dark",
          "Author":"Haruki Murakami"
       },
       {
          "Name":"It",
          "Author":"Stephen King"
       }
    ][{"Name":"new name","Author":"new author"}]
    

    恐怕无法直接在文件中更新当前的JSON结构。

    1. 我设法使用org.json library 解决了您的问题。但是,我的解决方案的缺点是每次都必须重写整个文件。此外,我使用了synchronized 关键字以避免同时修改文件。
    public synchronized void updateJsonFile(Book book) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        Path path = Paths.get("./books.json");
        final String currentJsonArrayAsString = Files.readString(path);
    
        try (FileWriter fileWriter = new FileWriter(path.toFile(), false)) {
    
            JSONObject jsonObject = new JSONObject(objectMapper.writeValueAsString(book));
            JSONArray jsonArray = new JSONArray(currentJsonArrayAsString);
            jsonArray.put(jsonObject);
    
            fileWriter.write(jsonArray.toString());
        }
    }
    

    现在books.json 有以下内容:

    [
       {
          "Author":"Haruki Murakami",
          "Name":"After Dark"
       },
       {
          "Author":"Stephen King",
          "Name":"It"
       },
       {
          "Author":"new author",
          "Name":"new name"
       }
    ]
    

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多