使用jacksonjava将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

我尝试使用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

我的例外: 线程“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文件的写入和读取这个怎么样?