如何在 Spring Boot 中返回 JSON 响应?

Posted

技术标签:

【中文标题】如何在 Spring Boot 中返回 JSON 响应?【英文标题】:How to return JSON response in Springboot? 【发布时间】:2021-02-20 09:29:17 【问题描述】:

我想在 Spring Boot 中返回类似这样的 json 响应:


   "status" : true,
   "message" : "Data is found",
   "data" : single object or list of object

我的 RestController 是这样的

@GetMapping("/users")
public JSONObject getAllUsers() 
    List<User> user = repository.findAll(); // get all users from db            
    JSONObject jsonObject = new JSONObject();

    jsonObject.put("status", true);
    jsonObject.put("message", "Data is found");
    jsonObject.put("data", user);

    return jsonObject;

但我收到了类似这样的回复


 "empty": false

那么,如何以我上面提到的格式返回 json 响应?

【问题讨论】:

【参考方案1】:

您可以简单地返回具有这些属性的对象。 例如声明一个代表你想要的响应的新类:

public class UserResponse 
    private Boolean status;
    private String message;
    private List data;

    public UserResponse()
    

    // setters & getters

然后改变你的控制器:

@GetMapping("/users")
public UserResponse getAllUsers() 
    List<User> user = repository.findAll(); // get all users from db

    UserResponse userResponse = new UserResponse();

    userResponse.setStatus(true);
    userResponse.setMessage("Data is found");
    userResponse.setData(user);

    return userResponse;

要深入了解您的方法有什么问题,您可以查看this answer

【讨论】:

【参考方案2】:

您可以使用以下方式,以便您响应任何您想要的数据。我已经用了很长时间了。

public class ApiResponse 

    private boolean status;
    private String message;
    private Object data;
    private ErrorCode errorCode;

    //use constructors instead of setters
    
    //getters

【讨论】:

【参考方案3】:

1.简单最快的解决方案是:

您可以返回一个 Map 作为返回类型,以在客户端获取 JSON 数据,如下所示

@GetMapping("/users")
public Map<String,?> getAllUsers() 
    List<User> user = repository.findAll(); // get all users from db
    
    Map<String, List> map = new HashMap<String, List>(); // use new HashMap<String, Object>(); for single result

    map.put("status", true);
    map.put("message", "Data is found");
    map.put("data", user);

    return map;

2。通过创建自定义响应类的其他解决方案:

在这里,您将为所有回复创建一个模型:如下所示

模型响应:

public class ResponseModel<T> 
    
    private Boolean status;
    private String message;
    private T data;
    
    
    public Boolean getStatus() 
        return status;
    
    public void setStatus(Boolean status) 
        this.status = status;
    
    public String getMessage() 
        return message;
    
    public void setMessage(String message) 
        this.message = message;
    
    public T getData() 
        return data;
    
    public void setData(T data) 
        this.data = data;
    

你的控制器应该看起来像

@GetMapping("/users")
public ResponseModel<?> getAllUsers() 

    List<User> users = repository.findAll();

    ResponseModel response = new ResponseModel<List<User>>();
    // use ResponseModel<User>(); constuructor for a single user response

    response.setStatus(true);
    response.setMessage("Data is found");
    response.setData(users);

    return response;

【讨论】:

Map 原始类型让我很难过,将Object 值映射分配给List 值一个也是如此。 @BoristheSpider 我已经添加了一个类模型响应,但是请您详细说明为什么返回地图会是一个坏主意,thnx ps:在地图泛型类型中,同意更改为列表(根据返回类型)【参考方案4】:

可以在springboot中使用GSON依赖,

 @GetMapping("/users")
 public String getAllUsers() 
     Gson gson = new Gson();
     List < User > user = repository.findAll(); // get all users from db
     JSONObject jsonObject = new JSONObject();
     jsonObject.put("status", true);
     jsonObject.put("message", "Data is found");
     jsonObject.put("data", user);
     String jsonInString = gson.toJson(jsonObject);
     return jsonInString;
 

【讨论】:

以上是关于如何在 Spring Boot 中返回 JSON 响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot REST API 中格式化返回的 json?

如何在 Spring Boot 中使用 Hibernate/JPA 返回多级 json

如何在 Spring Boot 中覆盖默认 JSON 响应

Spring Boot 控制器建议 - 如何返回 XML 而不是 JSON?

spring-boot-framework 如何自动将对象返回成json格式

Spring Boot返回Json数据及数据封装