JSON到POJO作为使用jackson java的对象类

Posted

技术标签:

【中文标题】JSON到POJO作为使用jackson java的对象类【英文标题】:JSON to POJO as Object class using jackson java 【发布时间】:2020-03-18 01:45:00 【问题描述】:

我正在尝试使用 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());

    

如果我错了,请告诉我。

提前致谢。

【问题讨论】:

查看此链接:***.com/questions/22849897/… @Derin 它没有使用 json 文件的读写。 这个怎么样:github.com/google/gson/blob/master/UserGuide.md? 【参考方案1】:

它说 thread "main" java.lang.ClassCastException: Cannot cast java.util.LinkedHashMap to com.me.dto.Post,这意味着您的 ts.jsonToDto() 返回一个 LinkedHashMap 并且不能转换为您的 DTO。

您可以参考here 了解更多信息。

问题来自杰克逊。当它没有足够的关于反序列化到哪个类的信息时,它使用 LinkedHashMap。

由于您没有通知 Jackson 您的 ArrayList 的元素类型,它不知道您想要反序列化为 Accounts 的 ArrayList。所以它会回退到默认值。

他们还在那里为您提供了解决方案。

【讨论】:

【参考方案2】:

如果你调试代码,你会在课堂上看到下面的代码 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<String,Object>(2);
                    
                
            case JsonTokenId.ID_FIELD_NAME:
                return mapObject(p, ctxt);
....

从上面我们可以看出,如果你的Class是java.lang.Object,它将执行JsonTokenId.ID_START_OBJECT的case,并返回一个LinkedHashMap作为结果。

【讨论】:

以上是关于JSON到POJO作为使用jackson java的对象类的主要内容,如果未能解决你的问题,请参考以下文章

使用jackson将pojo(对象列表)转换为java中的json

使用 Jackson 将 JSON 反序列化为 ArrayList<POJO>

jackson 进行json与java对象转换 之四

使用 Jackson JSON Mapper 在 JSON 到 POJO 之间映射时出现 400 Bad Request

Javajacksonjson与pojo之间的转化

使用Jackson“意外令牌(START_OBJECT)使用LocalDateTime将JSON解析为POJO,预期VALUE_STRING:预期的数组或字符串。”