如何使用 Jackson 将对象附加到现有的 JSON 文件

Chi*_*own 3 java json jackson

如何使用 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);
Run Code Online (Sandbox Code Playgroud)

Dev*_*abc 5

在您的问题中,“追加”可以有多种含义/解决方案,具体取决于您将该词放置在哪个上下文中。例如:

  1. 一个简单的附加到文件,忽略现有的 JSON 结构。
  2. 附加到文件中的现有 JSON 数组。
    1. 附加到文件中的现有 JSON 数组,而 JSON 数组尚未关闭。
    2. 附加到文件中的现有 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

每个 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

每个 write() 附加到文件中现有的 JSON 数组,直到 close() 被调用。

示例 #2.2 的解决方案: 我还没有找到解决方案。在这种情况下,解决方案应该通过替换数组结束字符来修改文件],然后执行追加。

或者,如果性能和内存没有问题,您可以将 JSON 文件重新读取到 Java 对象,然后添加新的 JSON 对象,然后再次写入文件。

注意: 请注意,我不是 Jackson 专家,所以我不知道我的解决方案是否是最佳解决方案。