list字符串转对象list<T>或者字符串转map
背景介绍
在做接口对接时,遇到一个问题,请求报文中存在一个list,(postman)格式如下:
"reqBody": {
"activityType": "2",
"endDate": "2020-09-26",
"merchantId": "5313e02e36034e22abbcda51be8d8645",
"startDate": "2019-09-27",
"list": [
{
"productId": "1e14a7a24af44ecea1ec50c102bf219b",
"productSecDiscount": 1
},
{
"productId": "1e14a7a24af44ecea1ec50c102bf219b",
"productSecDiscount": 1
}
]
}
因为公司系统使用了自定义的拦截器,导致不能使用@RequestBody直接接收list中的内容,只能使用string收list。
那问题来了,前台接收到的字符串格式如下:
“[
{ productId=02e357356e2a4e0388a7f0cb7e327996, productSecDiscount=7.0},
{ productId=311bc5df8d3841e983ce2f4ab9f2426d, productSecDiscount=8.0}
]”
这个字符串并不是标准的json串,但是格式却还算标准。
问题分析
- 刚开始,并没有注意到,直接当成了json进行处理,导致各种报错,后来比对了一下,才发现不是标准的json串
直接比较来看的话,是去掉了接收参数中的双引号,且将冒号换成了等号。其实这个就是List调用toString后的结果。
下面是自己试验的一个小demoSystem.out.println(“打印map”);
List<Map<String,String>> list = new ArrayList<>();
Map<String,String> map = new HashMap<>();
map.put("name","zhangsan");
map.put("age","22");
list.add(map);
Map<String,String> map1 = new HashMap<>();
map1.put("name1","zhangsan");
map1.put("age1","22");
list.add(map1);
System.out.println(list.toString());
输出:
打印map
[{ name=zhangsan, age=22}, { name1=zhangsan, age1=22}]
问题解决
使用Gson进行转换
确认字符串格式,需方括号进行包裹 [],如:
“[{ name=zhangsan, age=22}, { name1=zhangsan, age1=22}]”
使用Gson进行转化,其中MarketActivityAddDetail是我的泛型对象,当然这里也可以换成map,间接的实现string和map之间的转换
Gson gson = new Gson();
List<MarketActivityAddDetail> list =
gson.fromJson(marketActityVo.getList(),
new TypeToken<List<MarketActivityAddDetail>>() { }.getType());
验证
请求参数:
处理结果:
成功赋值,验证通过
总结
因为之前直接把字符串当做了json串处理,浪费了不少时间。要善于发现数据的规律性,否则就只能使用字符串处理的方法进行分割和赋值了,那种方法肯定相当揉乱且低效,之前一直想用JSONArray或者JSONObject处理,但是没有成功,使用Gson处理的话就相当的高效。
本文关键参考 https://blog.csdn.net/hiqingtian/article/details/79448760
还没有评论,来说两句吧...