使用jacksonjava将JSON转换为POJO作为对象类
我尝试使用DTO到JSON(在JSON文件中写入)和JSON到DTO(从JSON文件读取)作为公共方法(由不同的pojo写/读操作使用的通用方法) 为了用作公共方法,我使用返回类型作为对象 在我的代码下面使用jacksonjava将JSON转换为POJO作为对象类,java,json,spring-boot,java-8,jackson,Java,Json,Spring Boot,Java 8,Jackson,我尝试使用DTO到JSON(在JSON文件中写入)和JSON到DTO(从JSON文件读取)作为公共方法(由不同的pojo写/读操作使用的通用方法) 为了用作公共方法,我使用返回类型作为对象 在我的代码下面 public String dtoToJSON(String appName, Object obj) throws IOException { ObjectMapper mapper = new ObjectMapper(); mapper.enable(Se
public String dtoToJSON(String appName, Object obj) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String postJson = mapper.writeValueAsString(obj);
System.out.println(postJson);
// Save JSON string to file
FileOutputStream fileOutputStream = new FileOutputStream("post.json");
mapper.writeValue(fileOutputStream, obj);
fileOutputStream.close();
return appName;
}
public Object jsonToDto() throws IOException {
ObjectMapper mapper = new ObjectMapper();
// Read JSON file and convert to java object
InputStream fileInputStream = new FileInputStream("post.json");
Object obj = mapper.readValue(fileInputStream, Object.class);
fileInputStream.close();
return obj;
}
我能够成功地运行DTO到JSON(在JSON文件中写入),但当我尝试运行JSON到DTO(从JSON文件读取)时,我得到了ClassCastException
我的例外:
线程“main”java.lang.ClassCastException:无法将java.util.LinkedHashMap转换为com.me.dto.Post
我的主要方法
public static void main(String[] args) throws IOException {
Transform ts=new Transform();
Post post=(Post)ts.jsonToDto();
// print post object
System.out.println("Printing post details");
System.out.println(post.getId());
System.out.println(post.getTitle());
System.out.println(post.getDescription());
System.out.println(post.getContent());
System.out.println(post.getLastUpdatedAt());
System.out.println(post.getPostedAt());
}
}
如果我错了,请告诉我
提前感谢。它说线程“main”java.lang.ClassCastException:无法将java.util.LinkedHashMap转换为com.me.dto.Post,这意味着您的ts.jsonToDto()
返回LinkedHashMap,并且无法转换为dto
有关更多信息,请参阅
这个问题来自杰克逊。当它没有足够的关于反序列化到哪个类的信息时,它使用LinkedHashMap
因为您没有通知Jackson您的ArrayList的元素类型,所以它不知道您想要反序列化到帐户的ArrayList中。因此,它又回到了默认状态
他们还为您提供了解决方案。上面说线程“main”java.lang.ClassCastException:无法将java.util.LinkedHashMap转换为com.me.dto.Post,这意味着您的ts.jsonToDto()
返回LinkedHashMap,并且无法转换为您的dto
有关更多信息,请参阅
这个问题来自杰克逊。当它没有足够的关于反序列化到哪个类的信息时,它使用LinkedHashMap
因为您没有通知Jackson您的ArrayList的元素类型,所以它不知道您想要反序列化到帐户的ArrayList中。因此,它又回到了默认状态
他们还为您提供了解决方案。如果您调试代码,您将在课堂上看到下面的代码
com.fasterxml.jackson.databind.desr.std.UntypedObjectDeserializer
....
switch (p.getCurrentTokenId()) {
case JsonTokenId.ID_START_OBJECT:
{
JsonToken t = p.nextToken();
if (t == JsonToken.END_OBJECT) {
return new LinkedHashMap<String,Object>(2);
}
}
case JsonTokenId.ID_FIELD_NAME:
return mapObject(p, ctxt);
....
。。。。
开关(p.getCurrentTokenId()){
案例JsonTokenId.ID\u开始\u对象:
{
JsonToken t=p.nextToken();
if(t==JsonToken.END\u对象){
返回新的LinkedHashMap(2);
}
}
案例JsonTokenId.ID\字段\名称:
返回mapObject(p,ctxt);
....
从上面我们可以看到,如果您的类是
java.lang.Object
,它将执行案例JsonTokenId.ID\u START\u Object
,并返回一个LinkedHashMap作为结果。如果调试代码,您将在类中看到下面的代码
com.fasterxml.jackson.databind.desr.std.UntypedObjectDeserializer
....
switch (p.getCurrentTokenId()) {
case JsonTokenId.ID_START_OBJECT:
{
JsonToken t = p.nextToken();
if (t == JsonToken.END_OBJECT) {
return new LinkedHashMap<String,Object>(2);
}
}
case JsonTokenId.ID_FIELD_NAME:
return mapObject(p, ctxt);
....
。。。。
开关(p.getCurrentTokenId()){
案例JsonTokenId.ID\u开始\u对象:
{
JsonToken t=p.nextToken();
if(t==JsonToken.END\u对象){
返回新的LinkedHashMap(2);
}
}
案例JsonTokenId.ID\字段\名称:
返回mapObject(p,ctxt);
....
从上面,我们可以看到,如果您的类是
java.lang.Object
,它将执行案例JsonTokenId.ID\u START\u Object
,并返回一个LinkedHashMap作为结果。检查此链接:@Derin它没有使用json文件的写入和读取。这如何:?检查此链接:@Derin它没有使用json文件的写入和读取这个怎么样?