如何使用Java和Jackson附加到JSON

如何使用Java和Jackson附加到JSON,java,json,database,eclipse,jackson,Java,Json,Database,Eclipse,Jackson,我正在尝试一个简单的测试,其中代码附加了几个json条目,但是每次都会被覆盖(json文件在运行后只有一个条目)。我知道我需要以某种方式使用“[]”在JSON中创建一个数组,但我该如何做呢?还有,有没有更好的方法?我一直在四处搜索,每个库似乎都有很多用户编写的代码。谢谢 public class REEEE { private static Staff createStaff() { Staff staff = new Staff(); staff.setName("mky

我正在尝试一个简单的测试,其中代码附加了几个json条目,但是每次都会被覆盖(json文件在运行后只有一个条目)。我知道我需要以某种方式使用“[]”在JSON中创建一个数组,但我该如何做呢?还有,有没有更好的方法?我一直在四处搜索,每个库似乎都有很多用户编写的代码。谢谢

public class REEEE {

private static Staff createStaff() {

    Staff staff = new Staff();

    staff.setName("mkyong");
    staff.setAge(38);
    staff.setPosition(new String[] { "Founder", "CTO", "Writer" });
    Map<String, Double> salary = new HashMap() {
        {
            put("2010", 10000.69);
        }
    };
    staff.setSalary(salary);
    staff.setSkills(Arrays.asList("java", "python", "node", "kotlin"));

    return staff;
}

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();

    File file = new File("src//j.json");        
    for(int i = 0; i < 4; i++) {
        Staff staff = createStaff();

        try {
            // Java objects to JSON file
            mapper.writeValue(file, staff);

            // Java objects to JSON string - compact-print
            String jsonString = mapper.writeValueAsString(staff);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }
}
公共类reee{
私有静态Staff createStaff(){
职员=新职员();
staff.setName(“mkyong”);
工作人员设置(38);
setPosition(新字符串[]{“创建者”、“CTO”、“编写者”});
Map salary=newhashmap(){
{
put(“2010”,10000.69);
}
};
员工薪酬(工资);
setSkills(Arrays.asList(“java”、“python”、“node”、“kotlin”);
返回工作人员;
}
公共静态void main(字符串[]args)引发IOException{
ObjectMapper mapper=新的ObjectMapper();
File File=新文件(“src//j.json”);
对于(int i=0;i<4;i++){
Staff=createStaff();
试一试{
//将Java对象转换为JSON文件
mapper.writeValue(文件,职员);
//Java对象到JSON字符串-压缩打印
字符串jsonString=mapper.writeValueAsString(staff);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}

您可以在列表中添加员工,然后将列表写入文件,如下所示:

List<Staff> staffList = new LinkedList<>()
for(int i = 0; i < 4; i++) {
    Staff staff = createStaff();
    staffList.add(staff);
}
mapper.writeValue(file, staffList);
List staffList=newlinkedlist()
对于(int i=0;i<4;i++){
Staff=createStaff();
staffList.add(员工);
}
writeValue(文件,staffList);

希望能有所帮助。

Jackson
是用来解析和生成
JSON
有效载荷的。所有额外的逻辑都与向数组中添加新元素和回写到文件有关,您需要自己实现这些逻辑。这应该不难做到:

class JsonFileAppender {
    private final ObjectMapper jsonMapper;

    public JsonFileAppender() {
        this.jsonMapper = JsonMapper.builder().build();
    }

    public void appendToArray(File jsonFile, Object value) throws IOException {
        Objects.requireNonNull(jsonFile);
        Objects.requireNonNull(value);
        if (jsonFile.isDirectory()) {
            throw new IllegalArgumentException("File can not be a directory!");
        }

        JsonNode node = readArrayOrCreateNew(jsonFile);
        if (node.isArray()) {
            ArrayNode array = (ArrayNode) node;
            array.addPOJO(value);
        } else {
            ArrayNode rootArray = jsonMapper.createArrayNode();
            rootArray.add(node);
            rootArray.addPOJO(value);
            node = rootArray;
        }
        jsonMapper.writeValue(jsonFile, node);
    }

    private JsonNode readArrayOrCreateNew(File jsonFile) throws IOException {
        if (jsonFile.exists() && jsonFile.length() > 0) {
            return jsonMapper.readTree(jsonFile);
        }

        return jsonMapper.createArrayNode();
    }
}
一些用例的示例用法:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        Path jsonTmpFile = Files.createTempFile("json", "array");
        JsonFileAppender jfa = new JsonFileAppender();

        // Add POJO
        jfa.appendToArray(jsonTmpFile.toFile(), createStaff());
        printContent(jsonTmpFile); //1

        // Add primitive
        jfa.appendToArray(jsonTmpFile.toFile(), "Jackson");
        printContent(jsonTmpFile); //2

        // Add another array
        jfa.appendToArray(jsonTmpFile.toFile(), Arrays.asList("Version: ", 2, 10, 0));
        printContent(jsonTmpFile); //3

        // Add another object
        jfa.appendToArray(jsonTmpFile.toFile(), Collections.singletonMap("simple", "object"));
        printContent(jsonTmpFile); //4
    }

    private static Staff createStaff() {
        Staff staff = new Staff();

        staff.setName("mkyong");
        staff.setAge(38);
        staff.setPosition(new String[]{"Founder", "CTO", "Writer"});
        Map<String, Double> salary = new HashMap<>();
        salary.put("2010", 10000.69);

        staff.setSalary(salary);
        staff.setSkills(Arrays.asList("java", "python", "node", "kotlin"));

        return staff;
    }

    private static void printContent(Path path) throws IOException {
        List<String> lines = Files.readAllLines(path);
        System.out.println(String.join("", lines));
    }
}
二,

三,

四,


谢谢我知道你可以很好地打印json,但是你能很好地写json吗?所以当我打开json文件时,它会有适当的缩进和换行符吗?你解决了这个问题吗?下面的答案是否有用?Gson的类似问题:
[{"name":"mkyong","age":38,"position":["Founder","CTO","Writer"],"salary":{"2010":10000.69},"skills":["java","python","node","kotlin"]}]
[{"name":"mkyong","age":38,"position":["Founder","CTO","Writer"],"salary":{"2010":10000.69},"skills":["java","python","node","kotlin"]},"Jackson"]
[{"name":"mkyong","age":38,"position":["Founder","CTO","Writer"],"salary":{"2010":10000.69},"skills":["java","python","node","kotlin"]},"Jackson",["Version: ",2,10,0]]
[{"name":"mkyong","age":38,"position":["Founder","CTO","Writer"],"salary":{"2010":10000.69},"skills":["java","python","node","kotlin"]},"Jackson",["Version: ",2,10,0],{"simple":"object"}]