我如何使用Jackson将对象附加到现有JSON文件中?
File file = new File("test.json");
if (!file.exists()) {
file.createNewFile();
}
ObjectMapper mapper = new ObjectMapper();
ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());
mapper.writeValue(file, wtf);
最佳答案
在您的问题中,“附加”可能具有多种含义/解决方案,具体取决于您放置该词的上下文。例如:
普通追加到文件,忽略现有的JSON结构。
附加到文件中的现有JSON数组。
附加到文件中的现有JSON数组,而JSON数组尚未关闭。
附加到文件中现有的JSON数组,而JSON数组已关闭。
示例1的解决方案:
// File output: {"name":"Foo","age":20} {"name":"Bar","age":30} {"name":"Baz","age":40}
public static void plainAppendExample() {
File file = new File("u:\\test.json");
ObjectMapper mapper = new ObjectMapper();
try {
JsonGenerator g = mapper.getFactory().createGenerator(new FileOutputStream(file));
mapper.writeValue(g, new Person("Foo", 20));
mapper.writeValue(g, new Person("Bar", 30));
mapper.writeValue(g, new Person("Baz", 40));
g.close();
} catch (IOException e) {
e.printStackTrace();
}
}
每个writeValue()都会将一个普通的JSON对象追加到文件中,但会忽略以前的JSON结构。
示例2.1的解决方案:
// File output: [ {"name" : "Foo", "age" : 20}, {"name" : "Bar", "age" : 30}, {"name" : "Baz", "age" : 40} ]
public static void jsonArrayAppendExample2() {
try {
File file = new File("u:\\test.json");
FileWriter fileWriter = new FileWriter(file, true);
ObjectMapper mapper = new ObjectMapper();
SequenceWriter seqWriter = mapper.writer().writeValuesAsArray(fileWriter);
seqWriter.write(new Person("Foo", 20));
seqWriter.write(new Person("Bar", 30));
seqWriter.write(new Person("Baz", 40));
seqWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
每个write()追加到文件中现有的JSON数组的位置,直到调用close()为止。
示例#2.2的解决方案:
我还没有找到解决方案。在这种情况下,解决方案应通过替换数组关闭字符
]
来修改文件,然后执行追加。或者,如果性能和内存不是问题,则可以将JSON文件重新读取为Java对象,然后添加新的JSON对象,然后再次写入该文件。
注意:
请注意,我不是杰克逊专家,所以我不知道我的解决方案是否是最佳解决方案。