我以前从未使用过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
你能试试这个代码吗?我想你需要把你的数组列表转换成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();
}
}
第一个问题:您正在反序列化到没有任何泛型类型的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 确实 创建了我指定的类的对象,并且 不会 引发任何后续错误。 我知道