如何让接口返回 JSON 数据

Spring Boot 入门:如何让接口返回 JSON 数据

大家好呀!上一篇文章我们一起学习了 Spring Boot 项目创建和第一个 GET 接口,不少小伙伴在私信说 “学会啦!想继续学怎么返回 JSON 数据”。今天这篇就来手把手教你 —— 从理解 JSON 是什么,到写出能返回用户信息、商品列表的接口,全程无难点,看完就能动手练!

一、先搞懂:为什么接口要返回 JSON?

在开始写代码前,我们先花 1 分钟搞懂一个关键问题:为啥大家都喜欢用 JSON 传数据?

简单说,JSON 是一种 “通用的数据格式”,不管是前端(Vue)还是后端(Spring Boot),都能轻松读懂它。比如我们要给前端传一个用户的信息,用 JSON 写出来是这样的:

{
    "id": 1,
    "name": "小明",
    "age": 20,
    "phone": "13800138000"
}

是不是比纯字符串清晰多了?而且结构灵活,既能传单个对象(比如一个用户),也能传列表(比如多个商品),这也是 JSON 成为接口数据首选格式的原因。好消息是:Spring Boot 早就帮我们做好了 “JSON 转换” 的工作,不用我们写复杂代码,只要按规则定义 “实体类”,接口直接返回对象 / 列表,Spring Boot 会自动把它转成 JSON!

二、准备工作:确认项目环境

因为是上一篇文章的进阶内容,我们直接在之前创建的「first-springboot-project」项目里操作就行,不用新建项目。

没创建项目的小伙伴可以回去看上一篇文章,5 分钟就能新建一个~

三、第一步:创建 “实体类”(关键!)

要返回 JSON 数据,首先得有 “数据模板”—— 也就是「实体类」。比如我们要返回用户信息,就需要一个「User」类,里面定义 “id、姓名、年龄” 这些字段;要返回商品列表,就需要一个「Product」类,定义 “商品 ID、名称、价格”。

1. 创建 User 实体类(单个用户信息模板)

步骤 1:新建实体类包

在左侧项目结构里,找到「com.example.firstspringbootproject」包,右键点击 → 「New → Package」,输入包名「entity」(表示 “实体类”,统一放这里方便管理),按回车。

步骤 2:创建 User 类

右键点击「entity」包 → 「New → Java Class」,输入类名「User」,按回车。然后粘贴下面的代码:

package com.example.firstspringbootproject.entity;

// 用户实体类:对应JSON里的“用户信息”结构
public class User {

    // 字段1:用户ID
    private Integer id;

    // 字段2:用户姓名
    private String name;

    // 字段3:用户年龄
    private Integer age;

    // 字段4:用户手机号
    private String phone;

    // 添加“有参构造方法”(方便快速创建用户对象)
    public User(Integer id, String name, Integer age, String phone) {

        this.id = id;
        this.name = name;
        this.age = age;
        this.phone = phone;
    }

    // 【必须】添加所有字段的“getter和setter方法”(Spring Boot 要通过这些方法获取和设置字段值)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}
代码解释(重点看这 2 处):
  • 字段定义private Integer id 这些就是用户的属性,和 JSON 里的键(比如 “id”)一一对应;

  • getter/setter 方法:每个字段的 getId()setId() 这些方法,是 Spring Boot 获取 / 设置字段值的 “通道”,少一个都不行。

2. 创建 Product 实体类(单个商品信息模板)

按同样的方法,在「entity」包下新建「Product」类,粘贴代码:

package com.example.firstspringbootproject.entity;

// 商品实体类:对应JSON里的“商品信息”结构
public class Product {

   // 字段1:商品ID
   private Integer productId;

   // 字段2:商品名称
   private String productName;

   // 字段3:商品价格(用Double支持小数)
   private Double price;

   // 字段4:商品库存
   private Integer stock;

   // 有参构造方法(可选,方便创建商品)
   public Product(Integer productId, String productName, Double price, Integer stock) {
       this.productId = productId;
       this.productName = productName;
       this.price = price;
       this.stock = stock;
   }

   // 所有字段的getter和setter(必须)
   public Integer getProductId() {
       return productId;
   }

   public void setProductId(Integer productId) {
       this.productId = productId;
   }

   public String getProductName() {
       return productName;
   }

   public void setProductName(String productName) {
       this.productName = productName;
   }

   public Double getPrice() {
       return price;
   }

   public void setPrice(Double price) {
       this.price = price;
   }

   public Integer getStock() {
       return stock;
   }

   public void setStock(Integer stock) {
       this.stock = stock;
   }

}

小技巧:IDEA 自动生成 getter/setter

不用手动写 getter/setter!在实体类里右键 → 「Generate」(或按 Alt+Insert) → 选择「Getter and Setter」 → 勾选所有字段 → 点击「OK」,IDEA 会自动生成所有方法,省时又不会错~

四、第二步:写接口!返回 JSON 数据(2 种场景)

实体类准备好了,接下来就写接口 —— 我们分两种常见场景:返回单个 JSON 对象(一个用户)和返回 JSON 列表(多个商品)。

1. 场景 1:返回单个用户(单个 JSON 对象)

首先我们新建一个「JsonController」(跟HelloController区分开,分类管理更清晰)。

步骤 1:创建 JsonController

右键点击「com.example.firstspringbootproject.controller」包 → 「New → Java Class」 → 输入类名「JsonController」 → 粘贴代码:

package com.example.firstspringbootproject.controller;

import com.example.firstspringbootproject.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

// 还记得吗?这个注解表示返回数据(自动转JSON)
@RestController
public class JsonController {

   // 接口1:返回单个用户(单个JSON对象)
   // 访问路径:/user/single
   @GetMapping("/user/single")
   public User getSingleUser() {
       // 创建一个User对象(用有参构造方法快速赋值)
       User user = new User(1, "小明", 20, "13800138000");

       // 直接返回User对象!Spring Boot会自动转成JSON
       return user;
   }

}
关键说明:
  • 方法的返回值不再是 String,而是我们定义的 User 实体类;

  • 只要加了 @RestController 注解,Spring Boot 就会自动把 User 对象转换成 JSON 格式返回,不用我们写任何转换代码!

2. 场景 2:返回商品列表(JSON 数组)

在「JsonController」里再加一个方法,返回多个商品的列表(用 List<Product> 作为返回值):

package com.example.firstspringbootproject.controller;

import com.example.firstspringbootproject.entity.Product;
import com.example.firstspringbootproject.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

// 还记得吗?这个注解表示返回数据(自动转JSON)
@RestController
public class JsonController {

    // 接口1:返回单个用户(单个JSON对象)
    // 访问路径:/user/single
    @GetMapping("/user/single")
    public User getSingleUser() {
        // 创建一个User对象(用有参构造方法快速赋值)
        User user = new User(1, "小明", 20, "13800138000");

        // 直接返回User对象!Spring Boot会自动转成JSON
        return user;
    }

    // 接口2:返回商品列表(JSON数组)
    // 访问路径:/product/list
    @GetMapping("/product/list")
    public List<Product> getProductList() {

        // 1. 创建List集合(用来装多个Product对象)
        List<Product> productList = new ArrayList<>();

        // 2. 往集合里加3个商品对象
        productList.add(new Product(101, "华为手机", 3999.0, 100));
        productList.add(new Product(102, "苹果平板", 5999.0, 50));
        productList.add(new Product(103, "小米耳机", 299.0, 200));

        // 3. 直接返回List!Spring Boot会自动转成JSON数组
        return productList;

    }

}
关键说明:
  • 返回值是 List<Product>(表示 “Product 类型的列表”);

  • Spring Boot 会把 List 转换成 JSON 数组,格式像这样:[{}, {}, {}],每个 {} 就是一个商品的 JSON 对象。

五、第三步:运行测试!看 JSON 结果

代码写完了,和上一篇一样,运行项目然后测试接口~

1. 运行项目

找到「FirstSpringbootProjectApplication」启动类,点击绿色小三角运行(如果之前没关,直接重启就行)。控制台出现 “Started xxx in xxx seconds”,没有红色报错,就是运行成功。

2. 测试接口(用浏览器或 Apifox 都能测)

测试接口 1:返回单个用户(/user/single)
  • 浏览器地址栏输入:http://localhost:8080/user/single(如果改了端口,比如 8081,就用 http://localhost:8081/user/single);

  • 按回车后,会看到返回的 JSON 数据:

{
  "id": 1,
  "name": "小明",
  "age": 20,
  "phone": "13800138000"
}

是不是和我们之前说的 JSON 格式一模一样?字段名(比如 “id”)就是实体类里的属性名,值就是我们赋值的内容。

测试接口 2:返回商品列表(/product/list)
  • 浏览器地址栏输入:http://localhost:8080/product/list

  • 按回车后,会看到 JSON 数组(注意外面有 []):

[
  {
    "productId": 101,
    "productName": "华为手机",
    "price": 3999,
    "stock": 100
  },
  {
    "productId": 102,
    "productName": "苹果平板",
    "price": 5999,
    "stock": 50
  },
  {
    "productId": 103,
    "productName": "小米耳机",
    "price": 299,
    "stock": 200
  }
]

3 个商品对象都在数组里,前端拿到这个数据,就能轻松展示成商品列表啦~

用 Apifox 测试
  1. 新建快捷请求,Method 选 GET,URL 输接口地址;

  2. 点击 Send,下方 Response Body 选择「Pretty」→「JSON」,就能看到格式化后的 JSON 数据,字段对齐,一目了然。

六、常见问题:返回 JSON 遇到的小坑

1. 接口返回 字段缺失?

检查字段有没有getter 方法:少一个 getter,对应的字段就不会出现在 JSON 里(比如 User 类少了 getName(),JSON 里就没有 “name” 字段)。

2. 想修改 JSON 里的字段名?(比如实体类是 productId,JSON 想显示 id

  • 在实体类字段上加 @JsonProperty("id") 注解,比如:
@JsonProperty("id") // JSON里显示“id”,而不是“productId”

private Integer productId;
  • 重新运行项目,接口返回的 JSON 里,商品 ID 就会变成 “id”:101。

七、总结:返回 JSON 其实很简单!

今天我们学会了 3 个核心知识点:

  1. 实体类是 JSON 的 “模板”:定义字段、getter/setter,就能对应 JSON 结构;

  2. 接口返回值直接写实体类 / List:Spring Boot 自动转 JSON,不用手动处理;

  3. 两种常见场景:单个对象(返回实体类)、列表(返回 List <实体类>),覆盖 80% 日常开发需求。

其实你会发现,Spring Boot 把复杂的 JSON 转换工作都 “藏起来” 了,我们只需要关注 “数据是什么样的”(实体类)和 “要返回什么数据”(接口方法),这也是 Spring Boot 受欢迎的原因 —— 简单、高效。

下一篇文章,我会教大家怎么 “接收前端传过来的参数”(比如前端传用户 ID,后端返回对应的用户信息),这也是接口开发的核心技能,感兴趣的小伙伴点个关注,下次更新不迷路!

如果操作中遇到问题,欢迎在评论区留言,我会一一回复~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值