Java JSON正确反序列化ArrayList

Java JSON正确反序列化ArrayList,java,json,arraylist,jackson,Java,Json,Arraylist,Jackson,我以前从未使用过JSON,希望将ArrayList序列化为JSON文件 我的writer类如下所示: public class Writer { public void write(){ ArrayList<Person> personList = new ArrayList<>(); Person p1 = new Person("James", "Bond", LocalDate.of(1997,9,22)); Person p2 = ne

我以前从未使用过JSON,希望将
ArrayList
序列化为JSON文件

我的writer类如下所示:

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();
    }
}
公共类编写器{
公共空写(){
ArrayList personList=新的ArrayList();
人员p1=新人(“詹姆斯”,“邦德”,当地日期(1997年9月22日));
人p2=新人(“圣诞老人”、“圣诞老人”,当地日期(1918年11月6日));
人员p3=新人员(“彼得”、“格里芬”,当地日期(1978年3月24日));
人员p4=新人员(“Lois”,“Griffin”,当地日期(1982,7,14));
personList.add(p1);
personList.add(p2);
个人列表。添加(p3);
personList.add(p4);
ObjectMapper mapper=新的ObjectMapper();
ObjectWriter=mapper.writer(新的DefaultPrettyPrinter());
试一试{
writeValue(新文件(System.getProperty(“user.dir”)+“/File/Person.json”)、personList);
}捕获(IOE异常){
e、 printStackTrace();
}
}
我的reader类如下所示:

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

}
公共类读取器{
公共无效读取(){
ObjectMapper mapper=新的ObjectMapper();
试一试{
ArrayList liste=mapper.readValue(新文件输入流(“File/Personen.json”),ArrayList.class);
System.out.println(“读取:+liste.get(0));
}捕获(IOE异常){
e、 printStackTrace();
}
}
列表中的第一个对象如下所示:
Gelesen:{firstname=James,lastname=Bond,生日={year=1997,month=9,monthValue=9,dayOfMonth=22,年表={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不能强制转换为Person

你能试试这段代码吗。我想你需要将数组列表转换成json格式。然后以json格式检索它

public void write(){
    ArrayList<Person> personList = new ArrayList<>();
    JSONObject obj = new JSONObject();//JSON object.
    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);
    obj.put("list", personList);
    ObjectMapper mapper = new ObjectMapper();
    ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());
    try {
        writer.writeValue(new File(System.getProperty("user.dir")+"/File/Person.json"), obj);
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

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();
    }
}
public void write(){
ArrayList personList=新的ArrayList();
JSONObject obj=新的JSONObject();//JSON对象。
人员p1=新人(“詹姆斯”,“邦德”,当地日期(1997年9月22日));
人p2=新人(“圣诞老人”、“圣诞老人”,当地日期(1918年11月6日));
人员p3=新人员(“彼得”、“格里芬”,当地日期(1978年3月24日));
人员p4=新人员(“Lois”,“Griffin”,当地日期(1982,7,14));
personList.add(p1);
personList.add(p2);
个人列表。添加(p3);
personList.add(p4);
对象放置(“列表”,个人列表);
ObjectMapper mapper=新的ObjectMapper();
ObjectWriter=mapper.writer(新的DefaultPrettyPrinter());
试一试{
writeValue(新文件(System.getProperty(“user.dir”)+“/File/Person.json”),obj);
}捕获(IOE异常){
e、 printStackTrace();
} 
}
公共无效读取(){
ObjectMapper mapper=新的ObjectMapper();
试一试{
JSONObject obj=mapper.readValue(新文件(“G:\\Personen.json”);
//将JSON字符串从文件转换为对象
Person-Person=mapper.readValue(新文件(“G:\\Personen.json”)、Person.class);
System.out.println(“读取:“+obj”);
}捕获(IOE异常){
e、 printStackTrace();
}
}

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

要反序列化到您应使用的人员列表,请执行以下操作:

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

您是否必须使用objectMapper?@NegiRox否这只是我发现的第一种可能性您在反序列化时是否遇到异常?除了写入
System.out.println(list.get(0).getFirstname()时,什么都没有
要检查列表中的人是否与我的原始人匹配,我会得到一个
java.lang.ClassCastException:java.base/java.util.LinkedHashMap不能强制转换为person
中的这一行
read()
JSONObject obj=mapper.readValue(新文件输入流(“File/Personen.json”));
不起作用,因为没有参数为
FileInputStream
readValue()方法。
非常感谢您解决了这个问题!注册模块后,我的LocalDate仍然有问题,但我这里的问题解决了。