如何使用Java和Jackson附加到JSON
我正在尝试一个简单的测试,其中代码附加了几个json条目,但是每次都会被覆盖(json文件在运行后只有一个条目)。我知道我需要以某种方式使用“[]”在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
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"}]