作者:书友54330525 | 来源:互联网 | 2023-10-10 10:47
我正在尝试将DTO用作JSON(在Json文件中写入)和JSON转换成DTO(从JSON文件读取)作为常见方法(不同pojo写入/读取操作将使用的通用方法)
为了用作常用方法,我将返回类型用作对象。
在我的代码下面
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
我的例外:
线程“主” 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());
}
}
如果我错了,请让我知道。
谢谢。
它说线程“主” java.lang.ClassCastException:无法将java.util.LinkedHashMap转换为com.me.dto.Post ,这意味着您的ts.jsonToDto()
返回了 LinkedHashMap ,并且不能投射到您的DTO。
您可以参考here 以获得更多信息。
问题来自杰克逊。如果没有足够的信息反序列化到哪个类,则使用LinkedHashMap。
由于没有向Jackson通知ArrayList的元素类型,所以它不知道您想反序列化为AccountArray。因此,它恢复为默认值。
他们还在那里为您提供了解决方案。
,
如果您调试代码,您将在类中看到以下代码
com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer
....
switch (p.getCurrentTokenId()) {
case JsonTokenId.ID_START_OBJECT:
{
JsonToken t = p.nextToken();
if (t == JsonToken.END_OBJECT) {
return new LinkedHashMap(2);
}
}
case JsonTokenId.ID_FIELD_NAME:
return mapObject(p,ctxt);
....
从上面可以看到,如果您的Class是java.lang.Object
,它将执行案例JsonTokenId.ID_START_OBJECT
,并返回结果LinkedHashMap。