gpt4 book ai didi

java - JSON正确反序列化ArrayList

转载 作者:行者123 更新时间:2023-11-30 01:58:41 25 4
gpt4 key购买 nike

我以前从未使用过 JSON,并且想要序列化 ​​ArrayList<Person>到 JSON 文件。

我的作家类(class)如下所示:

public class Writer {

public void write(){
ArrayList<Person> personList = new ArrayList<>();

Person p1 = new Person("James", "Bond", LocalDate.of(1997,9,22));
Person p2 = new Person("Santa", "Claus", LocalDate.of(1918,11,6));
Person p3 = new Person("Peter", "Griffin", LocalDate.of(1978,3,24));
Person p4 = new Person("Lois", "Griffin", LocalDate.of(1982,7,14));

personList.add(p1);
personList.add(p2);
personList.add(p3);
personList.add(p4);

ObjectMapper mapper = new ObjectMapper();
ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());

try {
writer.writeValue(new File(System.getProperty("user.dir")+"/File/Person.json"), personList);
} catch (IOException e) {
e.printStackTrace();
}
}

我的读者类如下所示:

public class Reader {

public void read(){
ObjectMapper mapper = new ObjectMapper();

try {
ArrayList<Person> liste = mapper.readValue(new FileInputStream("File/Personen.json"), ArrayList.class);
System.out.println("Read: " + liste.get(0));
} catch (IOException e) {
e.printStackTrace();
}
}

列表中的第一个对象如下所示: Gelesen: {firstname=James, lastname=Bond, birthday={year=1997, month=SEPTEMBER, monthValue=9, dayOfMonth=22, chronology={id=ISO, calendarType=iso8601}, era=CE, dayOfYear=265, dayOfWeek=MONDAY, leapYear=false}}

如何将此 JSON 字符串转换回“person”类的 java 对象?我的序列化/反序列化有什么问题吗?

编辑:我想检查从 JSON 文件反序列化的列表中我的人是否与原始人相同,所以我写了 System.out.println(list.get(0).getFirstname()然后我得到了 java.lang.ClassCastException: java.base/java.util.LinkedHashMap cannot be cast to Person

最佳答案

第一个问题:您正在反序列化为没有任何泛型类型的 ArrayList,因此您收到的是 LinkedHashMap 的 ArrayList。 Jackson 不知道您想要人员列表,因此它使用 LinkedHashMap 作为适用于任何 json 的类型。

要反序列化为您应该使用的人员列表:

ArrayList<Person> list = mapper.readValue(new FileInputStream("./person.json"),
mapper.getTypeFactory().constructCollectionType(ArrayList.class, Person.class));

第二个问题:您正在使用 Java 8 时间(LocalDate 类),但 Jackson 并不知道。为了能够正确处理它,您需要从 jackson-datatype-jsr310 依赖项添加 JavaTimeModule 并注册它。

因此生成的代码将如下所示:

public void write() {
ArrayList<Person> personList = new ArrayList<>();

Person p1 = new Person("James", "Bond", LocalDate.of(1997, 9, 22));
Person p2 = new Person("Santa", "Claus", LocalDate.of(1918, 11, 6));
Person p3 = new Person("Peter", "Griffin", LocalDate.of(1978, 3, 24));
Person p4 = new Person("Lois", "Griffin", LocalDate.of(1982, 7, 14));

personList.add(p1);
personList.add(p2);
personList.add(p3);
personList.add(p4);

ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());

try {
writer.writeValue(new File("./person.json"), personList);
} catch (IOException e) {
e.printStackTrace();
}
}

public void read() {
ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());

try {
ArrayList<Person> list = mapper.readValue(new FileInputStream("./person.json"),
mapper.getTypeFactory().constructCollectionType(ArrayList.class, Person.class));
System.out.println("Read: " + list.get(0).getFirstname());
} catch (IOException e) {
e.printStackTrace();
}

}

关于java - JSON正确反序列化ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53558685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com