JSON正确反序列化ArrayList

19 浏览
0 Comments

JSON正确反序列化ArrayList

我以前从未使用过JSON,并且想要将ArrayList序列化为JSON文件。\n我的写入类如下所示:\n

public class Writer {
public void write(){
    ArrayList 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();
    }
}

\n我的读取类如下所示:\n

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

\n列表中的第一个对象如下所示:\nGelesen: {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}}\n如何将此JSON字符串转换回类\"person\"的Java对象?\n我的序列化/反序列化有什么问题吗?\n编辑:我想检查从JSON文件反序列化的列表中的人是否与原始人相同,所以我写了System.out.println(list.get(0).getFirstname(),然后我得到了java.lang.ClassCastException: java.base/java.util.LinkedHashMap cannot be cast to Person

0
0 Comments

问题的出现原因是在read()方法中,使用了错误的参数类型(FileInputStream)来调用readValue()方法。

解决方法是将参数类型修改为正确的类型(File),以便调用正确的readValue()方法。

修改后的read()方法代码如下:

public void read(){
    ObjectMapper mapper = new ObjectMapper();
    try {
        JSONObject obj = mapper.readValue(new File("G:\\Personen.json"));
        // Convert JSON string from file to Object
        Person person = mapper.readValue(new File("G:\\Personen.json"), Person.class);
        System.out.println("Read: " + obj);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

通过将参数类型修改为File,可以正确调用readValue()方法,解析JSON文件并将其转换为对象。

0
0 Comments

问题出现的原因是:没有指定ArrayList的泛型类型,因此Jackson默认将其反序列化为ArrayList。为了正确地将其反序列化为List,需要使用constructCollectionType方法指定泛型类型。

解决方法是:使用下面的代码将ArrayList反序列化为List

ArrayList 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 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 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();
    }
}

感谢解决第一个问题!尽管在注册了模块后仍然存在LocalDate的问题,但是我的问题已经解决了。

0