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

news2024/11/29 23:42:39

前言

在实际开发中,我们在前后端传送数据通常使用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")
    @ResponseBody
    public 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.coloradmin.cn/o/2215618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubantu配置net8.0环境

1、下载net8.0SDK包 下载地址&#xff1a;Download .NET 8.0 (Linux, macOS, and Windows) 下载命令&#xff1a; wget https://download.visualstudio.microsoft.com/download/pr/853490db-6fd3-4c17-ad8e-9dbb61261252/3d36d7d5b861bbb219aa1a66af6e6fd2/dotnet-sdk-8.0.4…

“DataOps+大模型”——数造科技在大模型时代的数据开发创新探索

写在前面 自《“数据要素x”三年行动计划》印发以来&#xff0c;各界积极投身于探索数据开发的新技术、新应用场景和新模式&#xff0c;力求通过挖掘数据要素的价值来推动新型生产力的蓬勃发展。在这个过程中&#xff0c;以大模型为核心的人工智能技术为数据开发工作带来了全新…

中学数学教学期刊是核心期刊吗?

中学数学教学期刊是核心期刊吗&#xff1f; 《中学数学教学》不是核心期刊&#xff0c;属于省级期刊。 该期刊由安徽省教育厅主管&#xff0c;合肥师范学院、安徽师范大学数学系、安徽省数学学会主办。 虽然它在中学数学教育领域有一定的影响力&#xff0c;被中国国家哲学社…

springboot 整合 快手 移动应用 用户事件 消息回调 验证

快手 移动应用 WebHook 接入指南https://mp.kuaishou.com/platformDocs/openAbility/webHook/accessGuide.html 上代码 import cn.dev33.satoken.annotation.SaIgnore; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstruc…

【Java】—— 数据结构与集合源码:数据结构概述与线性表、二叉树

1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; 战场&#xff1a;程序运行所需的软件、硬件环境 敌人&#xff1a;项目或模块的功能需求 指挥官&#xff1a;编写程序的程序员 士兵和装备&#xff1a;一行一行的代码 战术和策略&#xff1a;数据结构 上…

分享5款堪称神器的软件

​ 今天再来推荐5个超级好用的效率软件&#xff0c;每个都堪称神器中的神器&#xff0c;用完后觉得不好用你找我。 1. 启动器——Launchy ​ Launchy是一款开源的启动器软件&#xff0c;帮助用户快速启动应用程序、文件夹和文件。用户只需通过快捷键调出Launchy界面&#xff…

FFmpeg的简单使用【Windows】--- 视频混剪+添加背景音乐

一、功能描述 点击背景音乐区域的【选择文件】按钮&#xff0c;选择音频文件并将其上传到服务器&#xff0c;上传成功后会将其存储的位置路径返回。 然后&#xff0c;点击要处理视频区域的【选择文件】按钮选择要进行混剪的视频素材&#xff08;1-10个&#xff09;。 以上两…

使用three.js 实现蜡烛效果

使用three.js 实现蜡烛效果 import * as THREE from "three" import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"var scene new THREE.Scene(); var camera new THREE.PerspectiveCamera(60, window.innerWidth / window.in…

SpringBoot技术支持的桂林景点导航

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

华为云CodeArts API:API管理一体化平台 9月新特性上线啦!

CodeArts API是面向开发者&#xff0c;提供API设计、API开发、API文档、API调试、 API自动化测试一体化协作平台&#xff0c;通过维护API各开发阶段数据高度一致&#xff0c;支持开发者高效实现API设计、API开发、API测试一站式体验。 2024年9月&#xff0c;CodeArts API主要发…

JAVA开源项目 在线考试系统 计算机毕业设计

本文项目编号 T 007 &#xff0c;文末自助获取源码 \color{red}{T007&#xff0c;文末自助获取源码} T007&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 系…

bat(批处理脚本学习)

输出banner echo off echo () echo JL echo ^|^| echo LJ echo _,--"""""""---. echo , …

服务端技术架构演进之路

服务端技术架构演进之路 目录 服务端技术架构演进之路 0.架构中常见概念及理解 1.单机架构 2.应用数据分离架构 3.应用服务器集群架构 4.读写分离/主从分离架构 5.冷热分离架构 6.垂直分库架构 7.微服务架构 8.容器编排架构 本文以一个 " 电子商务 " 应…

[CS报错] error CS1617: /langversion 的选项“12”无效。使用 “/langversion:?“ 列出支持的值

报错 error CS1617: /langversion 的选项“12”无效。使用 “/langversion:?” 列出支持的值 解决 方法一 升级SDK,升级.NET6.0SDK或者.NET7.0SDK… 方法二 调整项目语言版本&#xff1a; 如果你不想或不能升级 SDK&#xff0c;可以通过调整项目文件 .csproj 中的 Lang…

AFSim仿真系统 --- 系统简解_11 行为与行为树

行为与行为树 行为树是一种人工智能技术&#xff0c;它使用户能够快速创建灵活的行为体&#xff0c;这些行为体包含各种战术模块&#xff0c;称为“行为”或“行为节点”。通过连接节点&#xff0c;可以将这些节点以多样且相互关联的方式组合在一起以定义行为。 快速入门 一…

微软默认软件要是换成这些,工作效率直接飙升10倍不止

你的电脑配置明明比别人高&#xff0c;打开文件却比别人慢&#xff0c;这是为什么&#xff1f; 有可能就是软件的问题&#xff0c;如果微软默认软件都被替换成下面这些宝藏级免费工具&#xff0c;工作效率直接飙升10倍不止&#xff01; Everything Windows自带的搜索工具速度…

【Linux】配置Mysql 远程连接

文章目录 一、安装 Mysql配置 Mysql修改密码 登录 Mysql设置远程连接开放端口3306详情看蛋卷 一、安装 Mysql sudo yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpmyum -y install mysql mysql-server --nogpgcheck配置 Mysql #MyS…

6款提升工作效率的电脑监控软件推荐

在现代企业管理中&#xff0c;电脑监控软件成为提高工作效率、优化资源配置的关键工具。它们不仅能帮助管理者监控员工的电脑活动&#xff0c;还能提供有助于提升生产力的详细报告和分析。以下是6款广受好评的电脑监控软件&#xff0c;能够帮助企业有效管理和提升员工效率。 1…

邻接矩阵的有向图(C语言代码)

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #define MAXVEX 100//最大顶点数 typedef struct {int vexs[MAXVEX];//存储顶点的数组int matrix[MAXVEX][MAXVEX];//存储邻接矩阵的二维数组int vexnum, edgenum;//顶点数边数 }MGraph;…

【SpringBoot详细教程】-12-SpringBoot整合定时任务 【持续更新】

Hello&#xff0c;大胸弟们&#xff0c;我们又又又见面了&#xff0c;今天攀哥继续为大家分享一下SpringBoot的教程&#xff0c;没点关注的宝宝&#xff0c;点一下关注。 &#x1f332; 定时任务简介 &#x1f33f; 定时任务使用场景 我们在编写SpringBoot应⽤中经常会遇到这…