java关于fastjson转成map后进行操作报错问题的坑
来源:互联网 发布:测试网速软件下载 编辑:程序博客网 时间:2024/06/03 19:47
本来今天,开开心心的在撸代码,结果被一个fastJson的坑坑了一个多小时,整个人都不好了。为了防止有同学重蹈我的覆辙,将这个问题做一下记录。希望可以帮到各位小伙伴。
需求如下:我有一个map形式的json字符串,key为字符串,value也为字符串(json格式),我现在要取所有的value,并将期转换为对应的对象形式。
代码如下(因为是项目中的问题,当时问题点并没有这么容易看出,为了简单易懂写了一个测试,只是为了将这个问题暴露出来)
代码1
@Test public void fastJsonTest2() { //模拟json String json = "{\"时尚零售\":{\"trade\":\"时尚零售\",\"passengerflow\":\"126.00\",\"sale\":\"67800.00\"},\"非遗\":{\"trade\":\"非遗\",\"passengerflow\":\"123.00\",\"sale\":\"34578.00\"},\"客栈\":{\"trade\":\"客栈\",\"passengerflow\":\"1235.00\",\"sale\":\"34000.00\"},\"民俗\":{\"trade\":\"民俗\",\"passengerflow\":\"5678.00\",\"sale\":\"12000.00\"},\"特色餐饮\":{\"trade\":\"特色餐饮\",\"passengerflow\":\"8900.00\",\"sale\":\"9009.00\"}}"; //将字符串转换为map形式 Map<String,String> map = JSON.parseObject(json, Map.class); //创建一个list存放对应的value对象 List<Sale> saleList = new ArrayList<>(); // 使用java8进行循环遍历 map.forEach((s1, s2) -> { //将s2json字符串转换为对象 Sale sale = JSON.parseObject(s2, Sale.class); //存入到list集合中 saleList.add(sale); }); //输出所有 System.out.println(saleList); }
开开心心的运行了代码,心想自己太机智了。还用了java8新特性。结果如下
说好的循环遍历list所有的值呢?怎么回事? 哪里出了问题?
代码2
@Test public void fastJsonTest2() { //模拟json String json = "{\"时尚零售\":{\"trade\":\"时尚零售\",\"passengerflow\":\"126.00\",\"sale\":\"67800.00\"},\"非遗\":{\"trade\":\"非遗\",\"passengerflow\":\"123.00\",\"sale\":\"34578.00\"},\"客栈\":{\"trade\":\"客栈\",\"passengerflow\":\"1235.00\",\"sale\":\"34000.00\"},\"民俗\":{\"trade\":\"民俗\",\"passengerflow\":\"5678.00\",\"sale\":\"12000.00\"},\"特色餐饮\":{\"trade\":\"特色餐饮\",\"passengerflow\":\"8900.00\",\"sale\":\"9009.00\"}}"; //将字符串转换为map形式 Map map = JSON.parseObject(json, Map.class); //创建一个list存放对应的value对象 List<Sale> saleList = new ArrayList<>(); // 使用java8进行循环遍历 map.forEach((s1, s2) -> { //将s2json字符串转换为对象 Sale sale = JSON.parseObject(s2.toString(), Sale.class); //存入到list集合中 saleList.add(sale); }); //输出所有 System.out.println(saleList); }
运行结果
仔细对比两个代码。区别就在于map的泛型以及s2的toString。具体原理如下
代码3
@Test public void fastJsonTest() throws Exception { String json = "{\"时尚零售\":{\"trade\":\"时尚零售\",\"passengerflow\":\"126.00\",\"sale\":\"67800.00\"},\"非遗\":{\"trade\":\"非遗\",\"passengerflow\":\"123.00\",\"sale\":\"34578.00\"},\"客栈\":{\"trade\":\"客栈\",\"passengerflow\":\"1235.00\",\"sale\":\"34000.00\"},\"民俗\":{\"trade\":\"民俗\",\"passengerflow\":\"5678.00\",\"sale\":\"12000.00\"},\"特色餐饮\":{\"trade\":\"特色餐饮\",\"passengerflow\":\"8900.00\",\"sale\":\"9009.00\"}}"; //客流销售信息 Map saleMap = JSON.parseObject(json, Map.class); System.out.println(saleMap); System.out.println(saleMap.get("特色餐饮").getClass()); //class com.alibaba.fastjson.JSONObject String s1 = saleMap.get("特色餐饮").toString(); //正常 String s2 = saleMap.get("特色餐饮")+""; //正常 String s3 = String.valueOf(saleMap.get("特色餐饮")); //正常 //String s4 = (String) saleMap.get("特色餐饮"); //报错 类型转换异常 System.out.println(s1); System.out.println(s2); System.out.println(s3); }
原来是因为转换成map后key确实是String,但是value居然是JsonObject,从而当我们给Map添加了双String泛型的时候相当于将JsonObject强转成了String,然后造成的报错。所以我们使用s1,s2,s3这三种方式将其转换为String类型。之后再进行操作即可。
虽然这个问题看似并没有什么难度。但是当你并不知道是哪里造成的问题时,而且还是在项目中的时候还是比较蛋疼的。
个人感觉这是fastJson的一个坑。。。希望可以帮助到更多的小伙伴。
以上结论仅为本人个人理解,如有问题,望指出,共同成长
阅读全文
0 0
- java关于fastjson转成map后进行操作报错问题的坑
- FastJSON处理Map的问题
- 打正式包混淆后fastjson报错ClassCastException和其他bean报错崩溃问题
- 关于Android studio 使用fastjson报错的解决方法
- 关于JAVA调用Matlab遇到的问题+JDK重装后原有项目报错的解决办法
- 关于fastjson混淆打包后javaBean报空指针异常的解决方案
- 使用jxl进行excel表操作报错的问题
- 关于SQL备份后还原报错问题的解决
- 关于Android出BUG后,连续报错的问题
- Storm0.9.3启动后关于参数问题的报错
- FastJson关于java的使用
- FastJson关于java的使用
- FastJson关于java的使用
- 【FastJSON坑】--- java实体包含实体转换JSON报错
- 关于使用google map程序中报java.lang.NoClassDefFoundError: android.net.NetworkConnectivityListener的问题
- java使用fastjson进行数据的封装
- 关于JSONObject to Map 数字太大被转成科学计数法的问题
- 关于jeecg自动生成代码后,进入前端页面后后端报错的问题
- Gerrit代码Review入门实战
- 机器学习-KNN算法(python)
- no device found for connection ‘ System eth0′问题
- HTML5 canvas 基本语法
- c++ primer(三)
- java关于fastjson转成map后进行操作报错问题的坑
- ecshop常用标签
- Android开发环境搭建及程序结构
- 支付宝支付
- C# 文件下载(一)同步
- 记一次Linux杀毒过程
- validate表单验证
- Sublime Text 如何连接 FTP/SFTP ——图文详细教程
- 面试题8:旋转数组中的最小值