小記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,省去了中間環節提高了效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM