ajax请求返回map,前端获取结果

迷南。 2022-04-18 00:56 331阅读 0赞

因业务需求,今天需要ajax请求的时候从后端返回一个map,但是问题是怎么在前端取值,这个以前遇到过,以为会比较简单,但是百度很多答案都不完整,导致没有办法借鉴。这里做下记录

后端代码:

  1. @RequestMapping(value="/getCityByLevel.action", method = RequestMethod.POST)
  2. public @ResponseBody Object getCityByLevel() {
  3. //查询一线城市
  4. List<RhCityDto> cityInfo = rhCityService.listCityByLevel("");
  5. List<RhCityDto> cityInfo1 = new ArrayList<RhCityDto>();
  6. List<RhCityDto> cityInfo2 = new ArrayList<RhCityDto>();
  7. for(RhCityDto info :cityInfo){
  8. if(CITY_LEVEL_ONE.equals(info.getLevel())){
  9. cityInfo1.add(info);
  10. }else{
  11. cityInfo2.add(info);
  12. }
  13. }
  14. HashMap<String, Object> map = new HashMap<>();
  15. map.put("cityInfo1",cityInfo1);
  16. map.put("cityInfo2",cityInfo2);
  17. return map;
  18. }

可以看到上面的代码返回的是Map>,注意使用了@ResponseBody注解

前端请求和处理代码:

  1. /**
  2. * 城市下拉复选框内容赋值
  3. */
  4. function initCity(){
  5. var json = {
  6. };
  7. $.ajax({
  8. type: "POST",
  9. url: "../bireport/getCityByLevel.action",
  10. contentType : "application/json",
  11. dataType:"json",
  12. data: JSON.stringify(json),
  13. success: function(resp){
  14. //这里的cityInfo1是后端map的key
  15. var aa = resp["cityInfo1"];
  16. var firstCity ="";
  17. for(var city in aa){
  18. firstCity+= "<option value='"+aa[city].code+"'>"+aa[city].name+"</option>"
  19. }
  20. aa = resp["cityInfo2"];
  21. var secondCity ="";
  22. for(var city in aa){
  23. secondCity+= "<option value='"+aa[city].code+"'>"+aa[city].name+"</option>"
  24. }
  25. $("#firstCity").html(firstCity);
  26. $('#firstCity').selectpicker("refresh");
  27. $("#secondCity").html(secondCity);
  28. $('#secondCity').selectpicker("refresh");
  29. },
  30. error:function(resp){
  31. $.messager.alert('出错了','系统出错,请联系管理员。','error');
  32. }
  33. });
  34. }

上面的 dataType声明为”json”

注意点:

1前端发送ajax请求时 dataType一定声明为”json”

ajax请求dataType值为json,jquery就会把后端返回的字符串尝试通过JSON.parse()尝试解析为js对象。所以如果你不将dataType设置为json,可以这样自己用json解析,如下:

  1. /**
  2. * 城市下拉复选框内容赋值
  3. */
  4. function initCity(){
  5. var json = {
  6. };
  7. $.ajax({
  8. type: "POST",
  9. url: "../bireport/getCityByLevel.action",
  10. contentType : "application/json",
  11. dataType:"text",
  12. data: JSON.stringify(json),
  13. success: function(resp){
  14. //自己进行json解析也可以
  15. resp = JSON.parse(resp);
  16. var aa = resp["cityInfo1"];
  17. var firstCity ="";
  18. for(var city in aa){
  19. firstCity+= "<option value='"+aa[city].code+"'>"+aa[city].name+"</option>"
  20. }
  21. aa = resp["cityInfo2"];
  22. var secondCity ="";
  23. for(var city in aa){
  24. secondCity+= "<option value='"+aa[city].code+"'>"+aa[city].name+"</option>"
  25. }
  26. $("#firstCity").html(firstCity);
  27. $('#firstCity').selectpicker("refresh");
  28. $("#secondCity").html(secondCity);
  29. $('#secondCity').selectpicker("refresh");
  30. },
  31. error:function(resp){
  32. $.messager.alert('出错了','系统出错,请联系管理员。','error');
  33. }
  34. });
  35. }

预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:

•”xml”: 返回 XML 文档,可用 jQuery 处理。
•”html”: 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
•”script”: 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 “cache” 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
•”json”: 返回 JSON 数据 。
•”jsonp”: JSONP 格式。使用 JSONP 形式调用函数时,如 “myurl?callback=?” jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
•”text”: 返回纯文本字符串

2后台方法的声明需要使用@responseBody??

@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。

这个注解表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用。

在使用@RequestMapping后,返回值通常解析为跳转路径。加上@responsebody后,返回结果直接写入HTTP response body中,不会被解析为跳转路径。比如异步请求,希望响应的结果是json数据,那么加上@responsebody后,就会直接返回json数据。

发表评论

表情:
评论列表 (有 0 条评论,331人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ajax请求返回map前端获取结果

    因业务需求,今天需要ajax请求的时候从后端返回一个map,但是问题是怎么在前端取值,这个以前遇到过,以为会比较简单,但是百度很多答案都不完整,导致没有办法借鉴。这里做下记录