JSON正确反序列化ArrayList
JSON正确反序列化ArrayList
我以前从未使用过JSON,并且想要将ArrayList
序列化为JSON文件。\n我的写入类如下所示:\n
public class Writer { public void write(){ ArrayListpersonList = 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 { ArrayListliste = 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
问题的出现原因是在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文件并将其转换为对象。
问题出现的原因是:没有指定ArrayList的泛型类型,因此Jackson默认将其反序列化为ArrayList
解决方法是:使用下面的代码将ArrayList反序列化为List
ArrayListlist = mapper.readValue(new FileInputStream("./person.json"), mapper.getTypeFactory().constructCollectionType(ArrayList.class, Person.class));
第二个问题是使用了Java 8的时间类(LocalDate),但是Jackson不知道如何处理它。为了正确地处理这个问题,需要添加jackson-datatype-jsr310依赖,并注册JavaTimeModule。
所以最终的代码如下:
public void write() { ArrayListpersonList = 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的问题,但是我的问题已经解决了。