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

这篇具有很好参考价值的文章主要介绍了SpringBoot (二) --- 返回Json数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot(二) — 返回Json数据

springboot返回json数据,SpringBoot,json,spring boot,java

什么是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
@Mapping
public @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依赖:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.7.9</version>
      <scope>compile</scope>
</dependency>

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

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.13.5</version>
      <scope>compile</scope>
</dependency>
<dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jdk8</artifactId>
      <version>2.13.5</version>
      <scope>compile</scope>
</dependency>
<dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
      <version>2.13.5</version>
      <scope>compile</scope>
</dependency>
<dependency>
      <groupId>com.fasterxml.jackson.module</groupId>
      <artifactId>jackson-module-parameter-names</artifactId>
      <version>2.13.5</version>
      <scope>compile</scope>
</dependency>

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

不同数据类型返回的JSON

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

创建People实体类

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

springboot返回json数据,SpringBoot,json,spring boot,java

导入lombok依赖:

<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>1.18.20</optional>
</dependency>

然后在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等方法。

springboot返回json数据,SpringBoot,json,spring boot,java

创建JsonController类

分别返回People对象,List,Map<String,Object>。

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;

@RestController
public class JsonController {

    @RequestMapping("/People")
    public People getPeople() {
        return new People("tom", 18, "男");
    }

    @RequestMapping("/list")
    public List<People> getPeopleList() {
        List<People> 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<String, Object> getMap() {
        Map<String, Object> 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,就需要小小的变形一下

引入依赖:

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.9</version>
</dependency>

重新编写我们的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;


@RestController
public 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

springboot返回json数据,SpringBoot,json,spring boot,java

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;

@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");	// 主要修改的地方,你哪怕填写 哦豁 null也会替换成 哦豁
            }
        });
        return objectMapper;
    }
}

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

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

@RequestMapping("/map")
    public Map<String, Object> getMap() {
        Map<String, Object> 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用来存放一些公共类:

springboot返回json数据,SpringBoot,json,spring boot,java

R类中代码如下:

import lombok.Data;

@Data
public class R<T> {

    /** 编码:1成功,0和其它数字为失败*/
    private Integer code;

    /** 信息返回*/
    private String msg;

    /** 信息返回数据*/
    private T data;


    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        r.msg = CommonConst.SUCCESS_RESULT;
        return r;
    }

    public static <T> R<T> error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

}

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

springboot返回json数据,SpringBoot,json,spring boot,java

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;

@RestController
public class JsonController {

    @RequestMapping("/people")
    public R<People> getPeople() {
        People people = new People("tom", 18, "男");
        return R.success(people);
    }

    @RequestMapping("/list")
    public R<List<People>> getPeopleList() {
        List<People> 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<Map<String, Object>> getMap() {
        Map<String, Object> 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<People> getMapOne(@PathVariable("name") String name) {
        Map<String, Object> 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;

}

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

springboot返回json数据,SpringBoot,json,spring boot,java

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


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

```java
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;

}

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

[外链图片转存中…(img-h0N86b8W-1679647709346)]文章来源地址https://www.toymoban.com/news/detail-597185.html

到了这里,关于SpringBoot (二) --- 返回Json数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 后端java 如何返回给前端 JSON数据

    在上述代码中,@ResponseBody注解用于将Java List对象转换为JSON格式的数据,并返回给前端。Spring会自动将List对象转换为JSON格式的数组,其中每个元素都是一个JSON对象。在本例中,每个JSON对象都包含一个name属性和一个age属性。 Regenerate

    2024年02月15日
    浏览(42)
  • spring boot 单元测试JUnit5使用MockMvc调用get请求,post请求,设置head请求头,解析返回值json和字符串

    spring boot 单元测试JUnit5使用MockMvc调用get/post接口 源码地址:https://gitcode.net/qq_39339588/springboot.git 1. 先准备一份controller,一会儿供测试调用 2. MockMvc测试调用get请求接口 两个注解说明 @SpringBootTest // 加测试类上,标明是测试的类 @AutoConfigureMockMvc // 支持对MockMvc对象的注入和配置,

    2024年02月14日
    浏览(50)
  • java返回前端实体类json数据时如何忽略某个属性

    第一种方法 SpringBoot中忽略实体类中的某个属性不返回给前端的方法:使用Jackson的方式://第一种方式,使用@JsonIgnore注解标注在属性上, 第二种方法 使用@JsonIgnoreProperties标注在类上,可以忽略指定集合的属性 注意 :同时使用@JsonProperty和@JsonIgnore时,可能会导致@JsonIgnore失效

    2024年02月13日
    浏览(40)
  • Spring Boot进阶(70):如何在Spring Boot中使用FastJson实现高效的JSON数据处理?

      随着互联网的发展,JSON(JavaScript Object Notation)已成为近年来使用最广泛的数据交换格式之一。为了提高JSON数据的处理效率,目前市面上常用的JSON解析库有Jackson、Gson、FastJson等。本文将介绍如何在Spring Boot中使用FastJson实现高效的JSON数据处理。   那么,具体如何实现

    2024年02月09日
    浏览(46)
  • Spring MVC学习随笔-Ajax集成(JSON格式返回数据)、拦截器(MyInterceptor)、全局异常处理(GlobalExceptionResolver)

    学习视频:【编程不良人】继spring之后快速入门springmvc,面对SpringMVC不用慌 引入相关依赖 开发控制器 日期格式修正 可以正常响应 拦截器 :Interceptor 拦截 中断 类似于javaweb中的Filter,不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处

    2024年02月05日
    浏览(48)
  • Springboot 接收POST、json、文本数据实践

    1,基本的接收方法 (1)下面样例 Controller 接收 form-data 格式的 POST 数据: (2)下面是一个简单的测试样例: 2,参数没有传递的情况 (1)如果没有传递参数 Controller 将会报错,这个同样有如下两种解决办法: 使用 required = false 标注参数是非必须的。 使用 defaultV

    2024年02月05日
    浏览(41)
  • 【Java】Mybatis查询数据库返回JSON格式的字段映射到实体类属性

    今天遇到了一个bug,大概就是数据库(Mysql)中有一个 type 类型字段,数据类型为json,大概是这样的:[“苹果”,“香蕉”,“葡萄”]的数据格式,这个bug的问题所在呢就是查询后这个json格式的数据无法映射到我们实体类的属性上,解决方案如下: 实体类的配置: @TableField

    2024年02月15日
    浏览(45)
  • springboot的controller如何拿到post请求中的json数据

    在SpringBoot的Controller中,可以使用注解@RequestBody来获取POST请求中的JSON数据。我们可以将这个注解应用到一个Controller方法的参数上,Spring将会负责读取请求正文中的数据,将其反序列化为一个Java对象,并将其作为Controller方法的参数传递。以 Java 代码为例,示例代码如下: 在

    2024年02月15日
    浏览(38)
  • Postman发送post和get请求json数据,并用SpringBoot接受

    1. 在controller类中加入如下代码用于举例 TestContoller.java 这里有两个映射,一个是\\\"/test\\\",用于测试程序有没有成功,一个是\\\"/User\\\",为用户,存放用户的账户名和密码 2. 在dto中导入数据以封装数据 TestDto.java @Data在导入lombok插件和依赖后可以直接使用,可以起到简化代码的作用 在

    2023年04月09日
    浏览(47)
  • SpringBoot利用自定义json序列化器实现敏感字段数据脱敏

    物料准备: 1.hutool依赖 2.自定义的jackson序列化器 3.测试@JsonSerialize效果 因为案例代码用到了hutool提供的DesensitizedUtil数据脱敏工具类,这里要引入hutool的依赖。 如果你需要自定义 数据脱敏的逻辑,可以不引入这个依赖 自定义一个手机号脱敏序列化器 自定义一个邮箱脱敏序列化

    2024年02月12日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包