小记SpringMVC与SpringBoot 的controller的返回json数据的不同

近期由于项目的改动变更,在使用springmvc和springboot测试的时候发现一个有趣的现象

1.springmvc的controller使用@ResponseBody返回的仅仅是json格式的字符串,如果要在页面使用json对象还需要通过转换才能得到json对象,这样才能使用相关的属性或者做遍历

 1 @RequestMapping("statisticsByYear.do")
 2     @ResponseBody
 3     public String statisticsYear(String type,String startYear,String endYear){
 4        List<StatisticsYearDTO> yearDTOList= new ArrayList<>();
 5        StatisticsYearDTO year1= new StatisticsYearDTO(2015,12501.5);
 6        StatisticsYearDTO year2= new StatisticsYearDTO(2016,22501.5);
 7        StatisticsYearDTO year3= new StatisticsYearDTO(2017,32501.5);
 8        StatisticsYearDTO year4= new StatisticsYearDTO(2018,52501.5);
 9        StatisticsYearDTO year5= new StatisticsYearDTO(2019,92501.5);
10        yearDTOList.add(year1);
11        yearDTOList.add(year2);
12        yearDTOList.add(year3);
13        yearDTOList.add(year4);
14        yearDTOList.add(year5);
15         String s=null;
16         ObjectMapper map= new ObjectMapper();
17         try {
18             s=map.writeValueAsString(yearDTOList);
19         } catch (JsonProcessingException e) {
20             e.printStackTrace();
21         }
22        
23         return s;
24     }

因为这里我是做业务测试,所以使用了json的转换工具,并没有返回对象集合,大家不必纠结这一点

return "[{\"year\":2015,\"totalMoney\":12501.5},{\"year\":2016,\"totalMoney\":22501.5}, " +
                "{\"year\":2017,\"totalMoney\":32501.5},{\"year\":2018,\"totalMoney\":52501.5}, " +
                "{\"year\":2019,\"totalMoney\":92501.5}]";

以上是实际返回的字符串格式

在页面显示的时候我使用ajax得到数据

1 $.getJSON("statisticsByYear.lovo",{},function (data) {
2              alert(data);
3             var jsons=jQuery.parseJSON(data)
4             $.each(jsons,function (i,e) {
5                 months.push(e.year+"年");
6                 charges.push(e.totalMoney);}

这里得到的数据并非json对象,而是json字符串,而且需要转换成json对象才能去遍历

下面是显示的内容打印

 在这里可以看到这仅仅是json格式的字符串

后续还需要我转换成json格式的对象才能使用遍历

1  var jsons=jQuery.parseJSON(data)

所以才有了以上这行代码

在springboot项目中的controller里面我并未做任何修改,这里贴上代码

 1  @RequestMapping("statisticsByYear")
 2     @ResponseBody
 3     public String statisticsYear(String type,String startYear,String endYear){
 4         /*这里需要去其他服务器远程调用,做为测试我写了一些假数据*/
 5         List<StatisticsYearDTO> yearDTOList= new ArrayList<>();
 6         StatisticsYearDTO year1= new StatisticsYearDTO(2015,12501.5);
 7         StatisticsYearDTO year2= new StatisticsYearDTO(2016,22501.5);
 8         StatisticsYearDTO year3= new StatisticsYearDTO(2017,32501.5);
 9         StatisticsYearDTO year4= new StatisticsYearDTO(2018,52501.5);
10         StatisticsYearDTO year5= new StatisticsYearDTO(2019,92501.5);
11         yearDTOList.add(year1);
12         yearDTOList.add(year2);
13         yearDTOList.add(year3);
14         yearDTOList.add(year4);
15         yearDTOList.add(year5);
16         String s=null;
17         ObjectMapper map= new ObjectMapper();
18         try {
19             s=map.writeValueAsString(yearDTOList);
20         } catch (JsonProcessingException e) {
21             e.printStackTrace();
22         }
23         return  s;
24     }

返回的s是

1  "[{\"year\":2015,\"totalMoney\":12501.5},{\"year\":2016,\"totalMoney\":22501.5},
2  {\"year\":2017,\"totalMoney\":32501.5},{\"year\":2018,\"totalMoney\":52501.5},
3 {\"year\":2019,\"totalMoney\":92501.5}]";

由于偷懒新部署的springboot项目里 并没有修改页面的代码,在测试的发现页面报错点击报错信息的时候发现了这个问题

 这里提示json有问题,我注释掉

1 var jsons=jQuery.parseJSON(data)

页面就回复正常了,一开始我以为我是使用了什么前端框架的原因,但是反过来一想就是一个简单的html页面除了echarts什么都没有

最后我在打印返回的数据的时候发现了问题

 在这里大家可以看到返回的页面的其实是json对象了并不是和前面一样是字符串,所以我们在使用转json的时候报错了

由于我的页面是放在静态资源下面的排除模板技术的影响,这其中的原因我认为是springboot对底层做了封装,在返回json格式的字符串的时候自动将其转换成了json对象

可能会有朋友认为你直接返回对象或者list等集合不就可以了吗?

但是如果去远程访问其他服务器的话,其他服务器给我们的是string类型的json格式数据我们还需要去建立dto等对象来做解析还原,然后再传输到页面去,

如果我们和对方约定好返回的数据格式则不需要再去建立相应的dto,省去了中间环节提高了效率。

猜你喜欢

转载自www.cnblogs.com/dypcd/p/12196757.html