当前位置: 首页 > 知识库问答 >
问题:

JSON正确反序列化ArrayList

商和雅
2023-03-14

我以前从未使用过JSON,我想序列化ArrayList

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

我的读者课是这样的:

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,生日={year=1997,month=九月,monthValue=9,dayOfMonth=22,年表={id=ISO,calendarType=iso8601},era=CE,dayOfYear=265,dayOfWeek=MONDAY,leapYear=false}

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

编辑:我想检查从JSON文件反序列化的列表中我的人是否与原始人相同,因此我编写了系统。出来println(list.get)(0)。getFirstname()然后我得到了一个java。ClassCastException:java。base/java。util。LinkedHashMap无法强制转换为Person


共有2个答案

夏侯楷
2023-03-14

你能试试这个代码吗?我想你需要把你的数组列表转换成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();
    }
}
强宾白
2023-03-14
匿名用户

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

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

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

第二个问题:你正在使用Java8次(LocalDate类),但杰克逊不知道。为了能够正确处理它,您需要从jackson-datatype-jsr310依赖项中添加JavaTimeMoules并注册它。

因此,生成的代码将是这样的:

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

}

 类似资料:
  • 问题内容: 我一直在尝试将对象序列化为CSV,但是该对象包含,并且不能在对象上使用。 预期样本输出 : 实际输出 : 这是我的代码 :(其中大多数是2个POJO) 我尝试的一切似乎都没有任何效果,但找不到有效的解决方案。 抱歉,我无缘无故留下的毫无意义的注释,如果您回答了代码,请随时删除它们。 问题答案: 从错误中,我想相信这与您的模式有关,该模式的列取自on 而不是值。 您可能想在其中添加,但是

  • 嗨,伙计们,我的客户端服务器出现了一些错误的JSON结构问题,我的客户机无法更改,我在这方面有处理。 我正在从JSON创建POJO,我已经尝试过GSON,现在我正在使用JACKSON,因为我认为JACKSON TREE会帮助我。 问题是服务器在只有一个对象时返回一个对象(扩展名),当它是几个对象时返回ArrayList。我知道这是一个糟糕的结构,为什么不返回一个带有1个对象的数组,但我什么也做不了

  • 奇怪的是下面的测试用例会失败。有人知道为什么吗?

  • 我正在将RedditAPI中的一些内容反序列化到POJO中。我的目标是尽可能简化代码,因为reddit中实体之间的JSON结构通常是相同的。 例如,反序列化链接对象的JSON如下所示: 我可以反序列化这一点没有问题,但由于reddit注释的不同之处在于其类型为t1,并且在其下方的数据对象中具有不同的结构,因此我希望将相同的类结构重新用于JSON包装,而不必创建多个具有一行或两行差异的复制类。 我创

  • 我需要一个自定义反序列化器来在复杂的POJO中转换字符串。反序列化工作直到使用反序列化器:特别是使用自定义反序列化器时,我的对象的非对象属性不会序列化。 我有一个restful Web服务,它有一个pojo作为参数。 所以我的类PreentivoWs需要一个方法。这里是类定义: 在jsonObject中,我有一个枚举定义为 但此对象需要转换反序列化程序: 并在财产上标注: fromString方法

  • 问题内容: 简而言之,这是我想在JAVA中解析的JSON对象的草图: 这些是我为解析而创建的 POJO (为简洁起见,我将省略这些语句): (1)完整的JSON对象的表示形式 (2)嵌套对象的表示: (3)项目的表示: 现在,创建一个Gson实例(用于导入), 每当我尝试访问可解析对象时(例如通过),都会收到一个。但是,Gson 确实 创建了我指定的类的对象,并且 不会 引发任何后续错误。 我知道