首页 > 编程语言 >【Java】无法将java.util.LinkedHashMap强制转换为X

【Java】无法将java.util.LinkedHashMap强制转换为X

时间:2022-12-26 13:34:09浏览次数:38  
标签:Java util JSON result java 序列化 LinkedHashMap

JsonJack:无法将java.util.LinkedHashMap强制转换为X

1. 概述

Jackson是一个广泛使用的Java库,它使可以方便地对JSON或XML进行序列化/反序列化。
有时,当尝试将JSON或XML反序列化为对象集合时,可能会遇到“ java.lang.ClassCastException:java.util.LinkedHashMap无法转换为X”。

 

2.问题分析

简单的来说,JSON反序列化时,未提供目标信息,它将使用目标类型:LinkedHashMap。接下来,我们来模拟这样的场景。

2.1 数据准备

首先先创建已经基础类:Person。

1 public class Person {
2     private  String name;       // 名称
3     private  int age;           // 年龄
4     // …… 这里省略了getter,setter等方法。
5 }

创建一个用于测试的API接口,http://localhost:8090/tsy/cip/test/getPersion 。返回的JSON数据如下:

 1 [
 2     {
 3         "name": "张三",
 4         "age": 22
 5     },
 6     {
 7         "name": "李四",
 8         "age": 22
 9     }
10 ]

我们创建测试数据,调用接口。

 1     @Test
 2     public void testError(){
 3         RestTemplate restTemplate = new RestTemplate();
 4         // 提交表单
 5         HttpHeaders headers = new HttpHeaders();
 6         headers.setContentType(MediaType.APPLICATION_JSON);
 7         headers.add("Content-Type","application/json;charset=UTF-8");
 8         //将请求头部和参数合成一个请求
 9         List<Person> result = restTemplate.getForObject("http://localhost:8090/tsy/cip/test/getPersion" , ArrayList.class);
10         System.out.println("result=>" + result);
11         System.out.println("[0]Name=>" + result.get(0).getName());      // 报错java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.tsyapp.crm.domain.Person
12     }

运行结果如下:

2.2 错误分析

已经声明了类型为List<Person>,但是为什么Jackson尝试将LinkedHashMap类型转换为Book类呢?此外,LinkedHashMap来自何处?

  • restTemplate.getForObject,传递的对象是ArrayList.class 。所以JSON可以将他们反序列化为数组,但它并不知道数组内的对象是什么类型。
  • 当未提供目标信息时,它使用默认类型LinkedHashMap。

标签:Java,util,JSON,result,java,序列化,LinkedHashMap
From: https://www.cnblogs.com/luyj00436/p/17003065.html

相关文章

  • 29_Java中的Stream流
    Java中的Stream流总的来所就是将一组数据转换为流进行操作过滤,然后再将其还原进行操作一、体验Stream流需求:按照下面的要求完成集合的创建和遍历​ 创建......
  • 为什么阿里的Java开发规范中禁止使用Executors创建线程池?
    一.问题概述最近壹哥有个学生出去面试,面试官的一个问题是:在开发中你使用什么方式创建线程池?这个学生答曰:使用jdk中自带的工厂类Executors创建线程池!该学生回答完问题后,感......
  • 高薪程序员&Java面试题精讲系列汇总
    因为没有分类归纳博客的功能,所以特写本帖汇总《高薪程序员面试题精讲系列教程》,方便大家查阅!希望各位小伙伴,可以从我的拙作中能对Java的高频面试题有所掌握,也希望各位可以多......
  • Linux系统上Java单体项目崩溃自启动脚本(通用型)
    本文转自https://blog.csdn.net/qq_38374397/article/details/127566529实现对进程的监控这里只需要三步:设置服务启动脚本设置监控shell脚本设置linux周期定时执行指令......
  • Java代码打包
    Java代码打包一:IDEA工具1、右侧的maven直接clean后package2、终端命令mvncleanpackage3、项目结构,创建工件,选择清单属性,构建工件4、指定主类打包、含多个类的jar打......
  • Java基础之常用类(String类)
    String类定义String类代表字符串。Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。我们可以将字符串看作是String,但是严格意义上来说,String还是......
  • javaScript 列表常用语法基础大全
    javascript数组常用方法1.push()=>语法,数组.push(数据)=>作用:向数组的末尾追加数据=>返回值:添加数据以后,返回新的数组2.pop()=>语法,数组.pop(数据)=>作用:删除......
  • Java:泛型方法、泛型类、泛型接口、类型通配符
    (目录)要求:JDK>=1.5泛型方法packagecom.example.demo;importjava.io.IOException;publicclassDemo{//泛型方法publicstatic<T>voidprintT(T......
  • Java编程思想17
    第二十一章:并发基本的线程机制  并发编程使我们可以将程序划分为多个分离的、独立运行的任务。通过使用多线程机制,这些独立任务(也被称为子任务)中的每一个都将由执行线程......
  • Java编程思想18
    从任务种产生返回值:Runnable是执行工作的独立任务,但是它不返回任何值。如果你希望在任务完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在JavaSE5中......