Jackson 不会将新的 JSON 对象附加到现有的 Json 文件中
Posted
技术标签:
【中文标题】Jackson 不会将新的 JSON 对象附加到现有的 Json 文件中【英文标题】:Jackson doesn't append new JSON object to exisiting Json file 【发布时间】: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 发送的:
我需要使用其他东西来达到我想要的结果吗? 我会感谢你的帮助。
【问题讨论】:
【参考方案1】:我已尝试根据您的代码重现您的问题,我得出以下结论:
您不能直接修改resources
下的文件。这里是explanation why。
我设法将新的JSON
附加到文件中(使用您的方法但在本地保存文件),但这可能不是您所期望的(json 结构已损坏):
[
"Name":"After Dark",
"Author":"Haruki Murakami"
,
"Name":"It",
"Author":"Stephen King"
]["Name":"new name","Author":"new author"]
恐怕无法直接在文件中更新当前的JSON结构。
-
我设法使用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"
]
【讨论】:
以上是关于Jackson 不会将新的 JSON 对象附加到现有的 Json 文件中的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 php 类 DOMDocument 将新的 xml 节点附加到现有的 .xml 文件?
将新的 ViewController 嵌入到现有的 UITabBarController 中?