Spring MVC:精通JSON数据返回的几种高效方式

devtools/2024/10/15 17:53:52/

前言

在实际开发中,我们在前后端传送数据通常使用Json格式,而在Spring MVC中返回Json格式的方式有多种,接下来我将介绍其中一些。

 准备工作

为了演示Json格式的数据,我们准备一个实体类,例如User,这些可以测试java中最常见的类型list集合如何转换成Json格式数据。

 User

public class User implements Serializable {private int user_id;private String user_name;private String password;public User(){}public User(int user_id, String user_name, String password) {this.user_id = user_id;this.user_name = user_name;this.password = password;}public int getUser_id() {return user_id;}public void setUser_id(int user_id) {this.user_id = user_id;}public String getUser_name() {return user_name;}public void setUser_name(String user_name) {this.user_name = user_name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

注意:SpringMVC设置返回值为Json的方式多种多样,我列举出来的,只是我了解的返回方式 

方式1:设置返回值为ModelAndView

  @RequestMapping("/showJson1")public ModelAndView showJsonInfo(){ModelAndView mv =new ModelAndView();List list=new ArrayList();User user1 =new User(1,"小王","111");User user2 =new User(2,"小明","222");User user3 =new User(3,"小美","333");list.add(user1);list.add(user2);list.add(user3);mv.addObject("list",list);mv.setView(new MappingJackson2JsonView());return mv;}

 当我们使用ModelAndView作为返回值时,可以使用setView方法,将

new MappingJackson2JsonView() 作为实参传入,此时直接返回ModelAndView即可返回Json格式数据。

效果演示

方式2:使用@ResponseBody注解

 @RequestMapping("/showJson2")@ResponseBodypublic User showJsonInfo2(){User user3 =new User(3,"小美","333");return user3;}

此时返回值可以是对象类型,例如User;也可以是集合类型,例如List<User>,只要加上注解,返回值都会转换成Json

效果演示

 

方式3:使用@RestController注解

在类上添加@RestController注解,可以将该类下所有的控制器方法的返回值都转换成Json格式

@RestController
public class TestController2 {@RequestMapping("test2")public User getUserJson(){User user =new User(1,"第一名","123");return user;}
}

查看源码可知,@RestController注解中包含了@ResponseBody,如下:

效果演示 

注意事项

  • @ResponseBody既可以作为方法注解,也可以作为类注解
    • 从Spring 4.0开始,@ResponseBody注解也可以被添加到类级别上。
  • 因此,在这里@RestController等价于@Controller+@ResponseBody

 方法4:使用ResponseEntity

ResponseEntity提供了一种更灵活的方式来构建HTTP响应,包括状态码、头部信息和响应体。你可以将JSON对象作为响应体返回。

@Controller
public class TestController3 {@RequestMapping("/testEntity")public ResponseEntity<User>getJson(){User user =new User(2,"第二名也不错","111");return ResponseEntity.ok(user);}
}

 将方法的返回值设置为 ResponseEntity<要转换成Json的类型>,这个类型可以是对象也可以是集合。return 返回ResponseEntity.ok(数据); 调用ResponseEntity中的静态方法ok,将数据转换成Json格式并返回

效果演示 

 

@Controller
public class TestController3 {@RequestMapping("/testEntity")public ResponseEntity<List<User> >getJson(){User user =new User(2,"第二名也不错","111");List<User> list=new ArrayList<>();list.add(user);return ResponseEntity.ok(list);}
}

效果演示 

方法5:手动序列化为JSON字符串

注意事项:如果使用的是jetty服务器插件,需要保证服务器版本为

才能正常启动成功

 第一步:导入ObjectMapper依赖

 <!--需要导入com.fasterxml.jackson.databind.ObjectMapper--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.0</version> <!-- 确保使用最新的稳定版本 --></dependency>

第二步:测试

@Controller
public class TestController4 {private ObjectMapper objectMapper=new ObjectMapper();@RequestMapping("/JsonSerializable")public String getSerializable() throws JsonProcessingException {User user =new User(3,"第三名","333");String str=objectMapper.writeValueAsString(user);System.out.println(str);return str;}
}

效果演示

可以看到,手动序列化的方式,将我们的数据直接转换成了Json格式的字符串数据,返回前端时,被视图解析器解析,认为字符串时一个视图名,所以显示出错。

解决方案:

加上@ResponseBody注解,

此时出现中文乱码,

问题分析:按f12,发现浏览器的响应字符编码为iso-8859-1,我们后台设置为utf-8

解决思路:设置编码集一致

总结

对于大多数用例来说,使用@RestController@ResponseBody注解是最简单和最直接的方法。如果你需要更细粒度的控制,可以考虑使用ResponseEntity或手动序列化。在全局范围内修改响应体时,可以使用ResponseBodyAdvice接口。无论选择哪种方法,都应该确保你的项目中包含了适当的JSON处理库(如Jackson)。


http://www.ppmy.cn/devtools/126278.html

相关文章

Unity MMORPG 背包系统如何设计

MMORPG游戏中背包系统是很重要的一个模块, 大部分的背包系统的讲解&#xff0c;都是讲如何设计UI&#xff0c;如何显示这些&#xff0c;其实这些东西并不是背包系统的核心&#xff0c;接下来我们来分析一下背包系统的数据结构如何设计&#xff0c;能让策划和程序很好的工作,以及…

深度学习模型新手入门指南

深度学习模型新手入门指南 近年来&#xff0c;深度学习已经成为人工智能和机器学习领域的热点话题。作为一种模仿人脑结构的计算模型&#xff0c;深度学习在图像识别、自然语言处理等诸多领域展现出了强大的能力。本指南将帮助新手理解深度学习的基本概念和技术要点&#xff0…

无需复杂计算!如何用“加法”打造高效而低功耗的语言模型

当我们聊到人工智能特别是语言模型时,大家脑海中可能浮现的都是庞大的计算能力、高能耗的服务器群。然而,最近有一篇有趣的论文《Addition Is All You Need for Energy-Efficient Language Models》(加法才是低能耗语言模型的关键)却颠覆了我们对语言模型的传统认知。那么,…

Linux 安装部署及使用Containerd容器管理工具 ~ 保姆级

目录 实验环境&#xff1a; &#xff08;1&#xff09;一台centos7.6 &#xff08;2&#xff09;关闭防火墙和selinux &#xff08;3&#xff09;可以连接外网 &#xff08;4&#xff09;配置公网仓库 1.部署containerd服务 (1)安装yum-util (2)添加阿里云 docker仓库 …

spring:Springboot3使用模版引擎thymeleaf

文章目录 介绍语法1、文本替换2、属性替换3、条件判断4. 列表循环5. 表单处理 基本示例视图解析机制视图解析器的默认配置为什么用Controller可以&#xff0c;用RestController就只是返回字符串 介绍 Thymeleaf 是一个现代的服务器端 Java 模板引擎&#xff0c;用于在服务器端…

优化神经网络的计算密集度

在神经网络模型设计和优化过程中&#xff0c;计算密集度低的模型容易导致 GPU 或其他硬件资源的利用率低下&#xff0c;从而影响训练和推理效率。为了解决这一问题&#xff0c;我们可以从多个角度入手&#xff0c;提升计算密集度&#xff0c;最大化硬件利用率。本文将总结如何优…

天通智能平板|智能移动终端|三防|单兵|平板|智能三防手持终端

全星魅科技推出的这款5G天通智能机是属于行业高端配置机型&#xff0c;CPU八核2G&#xff0c;内存8G128G&#xff0c;应急通信流畅操作不卡顿&#xff1b;电池15200毫安时超强续航&#xff08;是其他常规机子的2倍&#xff09;&#xff1b;屏幕坚如磐石&#xff0c;抗压抗摔&am…

Qt运行报错QWidget: Must construct a QApplication before a QWidget

报错文件为widget.cpp,原代码如下&#xff1a; #include <memory>QLineEdit *frequency new QLineEdit();QComboBox *cbBox_method new QComboBox();QLineEdit *X_MAXvalue new QLineEdit();QLineEdit *Y_MAXvalue new QLineEdit();QLineEdit *X_MINvalue…