广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >SpringBoot (二) --- 返回Json数据
  • 910
分享到

SpringBoot (二) --- 返回Json数据

jsonspringbootjava 2023-08-18 10:08:06 910人浏览 独家记忆
摘要

SpringBoot(二) — 返回JSON数据 文章目录 SpringBoot(二) --- 返回Json数据什么是JSONjson的基本语法格式如下: @RestController不同数据类型返回的JSON创建Peop

SpringBoot(二) — 返回JSON数据


什么是jsON

​ JSON(javascript Object Notation)是一种轻量级的数据交换格式。它是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互

相当于全球通用语—英语,中国56个民族不同地区的通用语言-普通话

json的基本语法格式如下:

  • json是一种纯字符数据,不属于编程语言
  • json的语法与js中object的语法几乎一致
  • json数据中的键值对可以使用编程语言中所谓的关键字
  • json的数据可以用花括号{}或中括号[]包裹,对应js中的object和array,示例{"name":"admin","age":18}或者["springBoot",3.1415,"json"]
  • json数据以键值对形式存在,多个键值对之间用逗号,隔开,但数据结束后,不允许出现没有意义的逗号,键值对的键和值之间用冒号:连接,键值对的部分,必须用双引号"包裹,单引号都不行;键值对的部分,不允许出现函数functionundefinedNaN,但是可以有null

​ 在我们的项目开发中,接口与接口之间,前后端之间的数据传输都是使用的JSON格式

@RestController

​ 上文我们有提到 @RestController = @controller + @ResponseBody,而@ResponseBody注解的作用就是将返回的数据转换为JSON格式。因此在SpringBoot中 使用@RestController 注解即可将返回的数据结构转换成 JSON 格式。我们还是点进(Ctrl+左键)@RestController看看:

@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Mappingpublic @interface RequestMapping {    String name() default "";    //指定请求的实际地址    @AliasFor("path")    String[] value() default {};    @AliasFor("value")    String[] path() default {};    //指定请求的method类型, GET、POST、PUT、DELETE等    RequestMethod[] method() default {};    //指定request中必须包含某些参数值是,才让该方法处理。    String[] params() default {};    //指定request中必须包含某些指定的header值,才能让该方法处理请求。    String[] headers() default {};    //指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;    String[] consumes() default {};    //指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;    String[] produces() default {};}

如此,我们学到了更多@RestController的参数。

我们点开 pom.xml 中的 spring-boot-starter-WEB 依赖,可以找到spring-boot-starter-json依赖:

      org.springframework.boot      spring-boot-starter-json      2.7.9      compile

继续点开 spring-boot-starter-json 依赖:

      com.fasterxml.jackson.core      jackson-databind      2.13.5      compile      com.fasterxml.jackson.datatype      jackson-datatype-jdk8      2.13.5      compile      com.fasterxml.jackson.datatype      jackson-datatype-jsr310      2.13.5      compile      com.fasterxml.jackson.module      jackson-module-parameter-names      2.13.5      compile

我们发现出现了许多jackson,至此我们知道了Spring Boot 中默认使用的 JSON 解析框架是 Jackson。

不同数据类型返回的JSON

在我们平时的项目开发中,常用的数据结构有 类对象、List对象、Map对象。

创建People实体类

新建entity包与Controller同级,entity我们用来存放实体类。

image-20230324110258370

导入lombok依赖:

     org.projectlombok     lombok     1.18.20

然后在File --> Settings --> Plugins,搜索 lombok 下载相关插件

在entity中编写我们的实体类:

import lombok.AllArgsConstructor;import lombok.Data;@Data   // 为属性添加get,set方法@AllArgsConstructor // 提供一个全参构造器,此时不在默认含有无参构造器public class People {    private String Name;    private Integer age;    private String gender;    }

点击左下角structure,可以看到,使用了@Data 和@AllArgsConstructor,lombok依赖已经自动帮我们建立好了get,set等方法。

image-20230324112144690

创建JsonController类

分别返回People对象,List,Map

import com.pan.entity.People;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@RestControllerpublic class JsonController {    @RequestMapping("/People")    public People getPeople() {        return new People("tom", 18, "男");    }    @RequestMapping("/list")    public List getPeopleList() {        List PeopleList = new ArrayList<>();        People People1 = new People("jack", 20, "男");        People People2 = new People("lucy", 23, "女");        PeopleList.add(People1);        PeopleList.add(People2);        return PeopleList;    }    @RequestMapping("/map")    public Map getMap() {        Map map = new HashMap<>(3);        People People = new People("jan", 25, "女");        map.put("人物信息", People);        map.put("家庭住址", "北京二环路");        map.put("代表作品", "《北京的天》");        map.put("书籍订阅", 4153);        return map;    }}

返回结果展示

在浏览器中输入:localhost:8080/people,返回 JSON 如下:

{"age":18,"gender":"男","name":"tom"}

在浏览器中输入:localhost:8080/list,返回 JSON 如下:

[{"age":20,"gender":"男","name":"jack"},{"age":23,"gender":"女","name":"lucy"}]

在浏览器中输入:localhost:8080/map,返回 JSON 如下:

{"人物信息":{"age":25,"gender":"女","name":"jan"},"代表作品":"《北京的天》","家庭住址":"北京二环路","书籍订阅":4153}

我们可以看到默认的 Jackson 框架将这三个常用的数据结构成功转成 JSON 格式。

补充一点

如何将String类型转换成json格式呢

我们知道@Controller如果遇到字符串会去寻找view的路径映射,而@RestController如果遇到字符串就会直接返回字符串。上面我们知道@RestController可以把数据结构转换成JSON类型。如果我们想把String返回成JSON,就需要小小的变形一下

引入依赖:

     com.alibaba     fastjson     1.2.9

重新编写我们的HelloController:

import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloController {    @RequestMapping("/hello")    public JSONObject Hello(){        String str = "{'result': 'success','msg': '登陆成功'}";        JSONObject jsonObject =  JSON.parseObject(str);        return jsonObject.getClass().getName();    }}

返回结果:

{"result":"success","msg":"登陆成功"}

Jackson 中对 null 的处理

在处理数据的过程中,我们难免会遇到一些 null 值。当我们转 JSON 时,不希望这些 null 出现,比如我们期望所有的 null 在转 JSON 时都变成““””这种空字符串

与controller包同级目录下我们创建一个config包用来存放我们的配置文件,并创建一个类JacksonConfig

image-20230324143032984

JacksonConfig内容:

import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.SerializerProvider;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.Http.converter.json.Jackson2ObjectMapperBuilder;import java.io.IOException;@Configurationpublic class JacksonConfig {    @Bean    @Primary    @ConditionalOnMissingBean(ObjectMapper.class)    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {        ObjectMapper objectMapper = builder.createXmlMapper(false).build();        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer() {            @Override            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {                jsonGenerator.writeString("");// 主要修改的地方,你哪怕填写 哦豁 null也会替换成 哦豁            }        });        return objectMapper;    }} 

这里面builder可能会爆红,但是并不影响编译与运行,这是idea工具本身造成的。

添加完配置文件后,我们修改一下map的内容:

@RequestMapping("/map")    public Map getMap() {        Map map = new HashMap<>(3);        People People = new People("jan", 25, null);        map.put("人物信息", People);        map.put("家庭住址", null);        map.put("代表作品", "《北京的天》");        map.put("书籍订阅", null);        return map;    }

比较输出结果:

添加配置类之前:

{"人物信息":{"age":25,"gender":null,"name":"jan"},"代表作品":"《北京的天》","家庭住址":null,"书籍订阅":null}

添加配置类之后:

{"人物信息":{"age":25,"gender":"","name":"jan"},"代表作品":"《北京的天》","家庭住址":"","书籍订阅":""}

效果达成!

封装一个通用类

在项目开发中,我们不仅需要封装数据,还需要在返回的JSON数据中添加一些其他信息,比如返回状态码code,返回信息msg等,这些信息有助于调用者进行一些简单的逻辑判断。因此,我们需要封装一个统一的JSON返回数据结构。

因为封装的JSON数据类型的不确定,所以我们在定义统一的JSON结构时,需要利用泛型。统一的 JSON 结构中属性包括数据、状态码、提示信息即可,构造方法可以根据实际业务需求做相应的添加。一般来说,应该有默认的返回结构,也应该有用户指定的返回结构。

可以新建包common用来存放一些公共类:

R类中代码如下:

import lombok.Data;@Datapublic class R {        private Integer code;        private String msg;        private T data;    public static  R success(T object) {        R r = new R();        r.data = object;        r.code = 1;        r.msg = CommonConst.SUCCESS_RESULT;        return r;    }    public static  R error(String msg) {        R r = new R();        r.msg = msg;        r.code = 0;        return r;    }}

此外,还可以在common包中提前定义好返回常量:

image-20230324150905905

CommonConst类中代码如下:

public class CommonConst {    public static final String SUCCESS_RESULT = "获取信息成功";    public static final String ERROR_RESULT = "获取信息成功";    // 需要什么信息添加什么}

这样我们也可以给R类中的msg返回 r.msg = CommonConst.SUCCESS_RESULT;

修改JsonController的返回值类型

因为 我们的通用类R 使用了泛型,所以所有的返回值类型都可以使用该统一结构。在具体的场景将泛型替换成具体的数据类型,非常方便,也便于维护。修改后的JsonController代码如下:

import com.pan.common.R;import com.pan.entity.People;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@RestControllerpublic class JsonController {    @RequestMapping("/people")    public R getPeople() {        People people = new People("tom", 18, "男");        return R.success(people);    }    @RequestMapping("/list")    public R> getPeopleList() {        List PeopleList = new ArrayList<>();        People People1 = new People("jack", 20, "男");        People People2 = new People("lucy", 23, "女");        PeopleList.add(People1);        PeopleList.add(People2);        return R.success(PeopleList);    }    @RequestMapping("/map")    public R> getMap() {        Map map = new HashMap<>();        People People = new People("jan", 25, "女");        map.put("人物信息", People);        map.put("家庭住址", "北京二环路");        map.put("代表作品", "《北京的天》");        map.put("书籍订阅", 4153);        return R.success(map);    }}

我们重新在浏览器中输入:localhost:8080/people,返回 JSON 如下:

{"code":1,"msg":"操作成功","data":{"age":18,"gender":"男","name":"tom"}}

我们重新在浏览器中输入:localhost:8080/list,返回 JSON 如下:

{"code":1,"msg":"操作成功","data":[{"age":20,"gender":"男","name":"jack"},{"age":23,"gender":"女","name":"lucy"}]}

我们重新在浏览器中输入:localhost:8080/map,返回 JSON 如下:

{"code":1,"msg":"操作成功","data":{"人物信息":{"age":25,"gender":"女","name":"jan"},"代表作品":"《北京的天》","家庭住址":"北京二环路","书籍订阅":4153}}

补充

1.@PathVariable注解的用法和作用

@PathVariable注解的作用是 映射 URL 绑定的占位符,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx”) 绑定到操作方法的入参中。一般与@RequestMapping(method = RequestMethod.GET)一起使用,例如我们给我们的JsonController增加一个方法:

 @RequestMapping(value = "/people/{name}",method = RequestMethod.GET) //或者直接用GetMapping注解,甚至method=RequestMethod.GET可以删掉    public R getMapOne(@PathVariable("name") String name) {        Map map = new HashMap<>(3);        People People = new People("jan", 25, "女");        map.put("name", People);        map.put("家庭住址", "北京二环路");        map.put("代表作品", "《北京的天》");        map.put("书籍订阅", 4153);        return R.success((People) map.get(name));    }

我们重新在浏览器中输入:localhost:8080/people/name,返回 JSON 如下:

{"code":1,"msg":"操作成功","data":{"age":25,"gender":"女","name":"jan"}}

通过在浏览器输入name,直接得到map中键名name的值

2.自定义输出格式—Json的几个注解

@JsonIgnore: 可用来忽略不想输出某个属性的标签;

import lombok.AllArgsConstructor;import lombok.Data;@Data   // 为属性添加get,set方法@AllArgsConstructor // 提供一个全参构造器,此时不在默认含有无参构造器public class People {    private String Name;    private Integer age;    @JsonIgnore    private String gender;}

我们重新在浏览器中输入:localhost:8080/people,返回 JSON 如下:

{"code":1,"msg":"操作成功","data":{"age":18,"name":"tom"}}// gender属性不在输出

**@JsonFORMat:**此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如:

public class time{    @JsonFormat(pattern = “yyyy-MM-dd HH-mm-ss”)    private Date date;}

**@JsonProperty:**可以指定某个属性和json映射的名称。例如我们有个json字符串为{“user_name”:”aaa”},而java中命名要遵循驼峰规则,则为userName,这时通过@JsonProperty 注解来指定两者的映射规则即可

public class SomeEntity {    @JsonProperty("user_name")    private String userName;}

更多的注解可以查看这个包:

image-20230324163904571

g":“操作成功”,“data”:{“age”:18,“name”:“tom”}} // gender属性不在输出

**@JsonFormat:**此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如:```javapublic class time{    @JsonFormat(pattern = “yyyy-MM-dd HH-mm-ss”)    private Date date;}

**@JsonProperty:**可以指定某个属性和json映射的名称。例如我们有个json字符串为{“user_name”:”aaa”},而java中命名要遵循驼峰规则,则为userName,这时通过@JsonProperty 注解来指定两者的映射规则即可

public class SomeEntity {    @JsonProperty("user_name")    private String userName;}

更多的注解可以查看这个包:

[外链图片转存中…(img-h0N86b8W-1679647709346)]

来源地址:https://blog.csdn.net/qq_54103767/article/details/129754242

--结束END--

本文标题: SpringBoot (二) --- 返回Json数据

本文链接: https://www.lsjlt.com/news/373842.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot (二) --- 返回Json数据
    SpringBoot(二) — 返回Json数据 文章目录 SpringBoot(二) --- 返回Json数据什么是JSONjson的基本语法格式如下: @RestController不同数据类型返回的JSON创建Peop...
    99+
    2023-08-18
    json spring boot java
  • SpringBoot怎么返回Json数据格式
    这篇文章主要介绍“SpringBoot怎么返回Json数据格式”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么返回Json数据格式”文章能帮助大家解决问题。一、@RestCon...
    99+
    2023-07-05
  • SpringBoot如何返回Json数据格式
    目录一、@RestController 注解二、Jackson1、对象、List、Map 转换为Json格式2、Jackson 的配置类三、FastjsonFastjson 配置类四...
    99+
    2023-03-22
    SpringBoot返回Json 返回Json数据格式 SpringBoot返回Json数据
  • SpringBoot返回Json对象报错(返回对象为空{})
    目录1 需求描述2 代码展示3 原因分析4 解决方案5 效果展示6 结束语1 需求描述 我们现在要干一个什么事情呢,我们要在浏览器输入一个请求地址,然后我们的后端就给我返回一个Use...
    99+
    2022-11-13
  • django如何返回json数据
    在Django中返回JSON数据,通常有两种方式:1. 使用`JsonResponse`类:可以将Python字典转换为JSON格式...
    99+
    2023-10-09
    django json
  • thinkphp怎么返回json数据
    在ThinkPHP中,可以使用`json`方法返回JSON数据。方法一:使用`json`方法返回JSON数据```php// 控制器...
    99+
    2023-10-10
    thinkphp json
  • springboot 返回json格式数据时间格式配置方式
    目录返回json格式数据时间格式配置返回json日期格式问题返回json格式数据时间格式配置 数据库里面查出来的时间是时间错格式,前段需要处理才能展示相应的格式,自己一个个转的话太麻...
    99+
    2022-11-12
  • SpringBoot怎么统一JSON信息返回
    这篇文章主要介绍“SpringBoot怎么统一JSON信息返回”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么统一JSON信息返回”文章能帮助大家解决问题。调用后端服务后的返回...
    99+
    2023-06-27
  • SpringBoot响应处理之以Json数据返回的实现方法
    目录一、示例代码二、返回值解析原理三、源代码分析(debug)四、内容协商机制1. 内容协商2. 内容协商原理重点源代码3. HttpMessageConverters消息转换器原理...
    99+
    2022-11-13
  • 使用php如何返回json数据
    使用php如何返回json数据?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampSer...
    99+
    2023-06-14
  • Django返回json数据用法示例
    本文实例讲述了Django返回json数据用法。分享给大家供大家参考,具体如下: 1、前端。jQuery发送GET请求,并解析json数据。getJSON方法可参考这里。 url = "http://e...
    99+
    2022-06-04
    示例 数据 Django
  • SpringBoot返回Json对象报错怎么办
    小编给大家分享一下SpringBoot返回Json对象报错怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1 需求描述我们现在要干一个什么事情呢,我们要在浏览...
    99+
    2023-06-28
  • springboot怎么封装返回数据
    在Spring Boot中,可以使用Java对象作为返回类型来封装返回数据。可以通过定义一个Java类来表示返回数据的结构,并在Co...
    99+
    2023-08-09
    springboot
  • Django 查询数据库返回JSON的实现
    目录返回多条数据返回单个对象和前端交互全部使用JSON,如何将数据库查询结果转换成JSON格式 返回多条数据 示例 import json from django.http i...
    99+
    2022-11-12
  • Mongoosefind查询返回json数据处理方式
    目录前言需求处理思路遇到问题解决方案总结前言 Mongoose find方法,打印看着返回的是json数据,实际返回的是Mongoose实例,为了方便自定义拓展或操作链式操作。 需求...
    99+
    2023-05-14
    Mongoose find Mongoose查询 查询返回json数据处理
  • springboot与数据库返回数据中文乱码
    问题描述:使用springboot操作数据库时,返回的中文数据一直是乱码 刚开始以为是springboot的问题,一直在网上搜索springboot返回数据是乱码结果我的问题压根对不...
    99+
    2022-11-12
  • springboot中PostMapping正常接收json参数后返回404问题
    目录PostMapping接收json参数后返回404问题描述解决@PostMapping注解解析PostMapping接收json参数后返回404 问题描述 js中传递json数据...
    99+
    2022-11-13
  • 怎么在Springboot中返回json屏蔽的属性
    这期内容当中小编将会给大家带来有关怎么在Springboot中返回json屏蔽的属性,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。entity上增加@JsonIgnoreProperties注解,标记需要...
    99+
    2023-06-06
  • springboot返回数据量大如何处理
    当Spring Boot应用程序需要返回大量数据时,以下是一些处理方法:1. 分页查询:可以使用Spring Data JPA或其他...
    99+
    2023-09-17
    springboot
  • Mongoose find 查询返回json数据处理方式
    目录前言需求处理思路遇到问题解决方案总结前言 Mongoose find方法,打印看着返回的是json数据,实际返回的是Mongoose实例,为了方便自定义拓展或操作链式操作。 需求 如图复制按钮,点击复制按钮填写信息,...
    99+
    2023-04-06
    Mongoose find Mongoose查询 查询返回json数据处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作