背景

​ SpringBoot中,使用@RquestBody注解 hashMap 接收多个参数的json字符串数据,包括一个数组和一个int值。数组中为一个个的对象组成。

问题

​ 使用 **map.get("list") **方法,并进行强制转换为 List 类型时,导致转换后的 List 中的对象变成了 LinkedHashMap 类型

​ 当使用 foreach 遍历 List 中的对象时,抛出类型转换异常

## 解决方法

​ 先将接收到的 hashMap 转换为 json 字符串,然后将得到的 json 字符串转为 list 即可

代码如下:

List<Physical> physicalList = JsonUtils.json2ListBean(JsonUtils.toJson(map.get("list")), Physical.class);

## 附上json工具类

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.sf.json.JSONArray;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.util.*; /**
* Json工具类
*/
public class JsonUtils { private static final ObjectMapper mapper = new ObjectMapper(); static {
mapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
mapper.setSerializationInclusion(Include.NON_NULL);
} private JsonUtils() {
} /**
* json字符串转换为类
*/
public static <T> T toBean(String json, Class<T> clazz) {
try {
T bean = (T) mapper.readValue(json, clazz);
return bean;
} catch (IOException e) {
e.printStackTrace();
}
return null;
} @SuppressWarnings("unchecked")
public static HashMap<String, Object> toBean(String json) {
return toBean(json, HashMap.class);
} @SuppressWarnings("unchecked")
public static HashMap<String,String> toBeanStr(String json) {
return toBean(json, HashMap.class);
} @SuppressWarnings("unchecked")
public static <T> T toBean(String json, TypeReference<T> tr){
try {
T bean = (T) mapper.readValue(json, tr);
return bean;
} catch (IOException e) {
e.printStackTrace();
}
return null;
} /**
* 对象转换为json字符串
*/
public static String toJson(Object bean) throws IOException {
String json = null;
JsonGenerator gen = null;
StringWriter sw = new StringWriter();
try {
gen = new JsonFactory().createGenerator(sw);
mapper.writeValue(gen, bean);
json = sw.toString();
} catch (IOException e) {
throw e;
} finally {
try {
if (gen != null) {
gen.close();
}
if (sw != null) {
sw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return json;
} @SuppressWarnings("unchecked")
public static List<Object> toList(String json) {
return toBean(json, ArrayList.class);
} /**
* 对象转换为Map
*/
public static Map<String, Object> transBean2Map(Object obj) {
if (obj == null) {
return null;
}
Map<String, Object> map = new HashMap<String, Object>();
try {
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
String key = property.getName();
if (!key.equals("class")) {
Method getter = property.getReadMethod();
Object value = getter.invoke(obj);
map.put(key, value);
}
}
} catch (Exception e) {
System.out.println("transBean2Map Error " + e);
}
return map;
} /**
* json字符串转换为List
*/
public static <T> List<T>json2ListBean(String json,Class<T>cls){
JSONArray jArray= JSONArray.fromObject(json);
Collection<T> collection = JSONArray.toCollection(jArray, cls);
List<T> list = new ArrayList<T>();
Iterator<T> it = collection.iterator();
while (it.hasNext()) {
T bean = (T) it.next();
list.add(bean);
}
return list;
}
}

**如果觉得这篇文章对你有帮助,就给个 推荐 吧!**

将HashMap转换为List的更多相关文章

  1. 验证HashSet和HashMap不是线程安全

    JAVA集合类: java.util包下的HashSet和HashMap类不是线程安全的, java.util.concurrent包下的ConcurrentHashMap类是线程安全的. 写2个测试 ...

  2. Map以及Set的遍历(EntrySet方法,补充enumeration和Iterator的区别)

    public void mearge(Map map) { Map returnMap = new HashMap<>(); // 转换为Entry Set<Map.Entry< ...

  3. 关于request.getParameterMap()的类型转换和数据获取

    首先po上一个自己写的转换类. /** * @author Xfiler * @described 将request.getParameterMap()转换为普通的Map的工具方法 * @param ...

  4. [设计模式]<<设计模式之禅>>关于里氏替换原则

    在面向对象的语言中,继承是必不可少的.非常优秀的语言机制,它有如下优点:● 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性:● 提高代码的重用性:● 子类可以形似父类,但又异于父类,“龙 ...

  5. 学号:201621123032 《Java程序设计》第9周学习总结(

    1:本周学习总结 1.1:以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2:书面作业 2.1: List中指定元素的删除(题集题目) 2.1.1:实验总结.并回答:列举至少2种在List ...

  6. JAVA核心技术I---JAVA基础知识(二进制文件读写和zip文件读写)

    一:二进制文件读写 (一)写文件 –先创建文件,写入数据,关闭文件 –FileOutputStream, BufferedOutputStream,DataOutputStream –DataOutp ...

  7. 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(四)——Android端Http访问类(转)

    本章目的 在上一章中,我们利用Hibernate Tools完成了Android Model层的建立,依赖Hibernate Tools的强大功能,自动生成了Model层.在本章,我们将继续我们的项目 ...

  8. Java:集合,Map接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  9. Map接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

随机推荐

  1. 'try(A a = new A())' VS 'try finally'

    实现了AutoCloseable接口的类,可以在try的时候直接实例化对象.try代码块完成之后,自动调用close方法,相当于在finally里主动调用.但是出现异常后的流程和try finally ...

  2. Vue官方文档笔记

    1.如何创建一个Vue实例对象? var vm = new Vue({ el: "#app", //标签id 或 标签类名 data:{ //双向绑定的数据 message: &q ...

  3. 一张图入门Python【中文版】

    好久没写了,就拿这张图作为开篇吧,重新梳理自己学习的东西,最近两年人工智能炒红了python,devops的提出也把开发.运维整合到了一起,作为一个运维工程师,随着企业自动化运维的提出,光会shell ...

  4. Java8 新特性 Data Time API

    Java8新的日期类型 在Java8以前,Date日期API对我们非常的不友好,它无法表示日期,只能以毫秒的精试来表示时间,并且可以修改,他的线程还不是安全的.所以Java8中引入了全新的日期和时间A ...

  5. FastDFS与hadoop的HDFS区别

    主要是定位和应用场合不一样 HDFS: 要解决并行计算中分布式存储数据的问题.其单个数据文件通常很大,采用了分块(切分)存储的方式. FastDFS: 主要用于大中网站,为文件上传和下载提供在线服务. ...

  6. 实用 PXE 配置:不断更新中...

    default menu.c32 #--------------------------------todo----------------------# 不过,实用http,nfs.cdrom等方式 ...

  7. java 精彩文章收集

    hashCode() 和equals() 区别和作用 字符串常量池 Java集合之LinkedHashMap

  8. CSS加载会阻塞页面显示?

    可能大家都知道,js执行会阻塞DOM树的解析和渲染,那么css加载会阻塞DOM树的解析和渲染吗?接下来,我们就一起来分析一下. 原理解析 那么为什么会出现上面的现象呢?我们从浏览器的渲染过程来解析下. ...

  9. 记一个netcore HttpClient的坑

    异常信息 The SSL connection could not be established, see inner exception ---> AuthenticationExceptio ...

  10. SQLServer日常bug记录

    问题1:如下图所示 原因分析:同时操作数据库中的两条数据引起的 解决方法:新建查询语句 delete 数据库名字.表名 where 引起错误的字段=引起错误的字段值