近期由於項目的改動變更,在使用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,省去了中間環節提高了效率。