【问题标题】:How to return JSON response in Springboot?如何在 Spring Boot 中返回 JSON 响应?
【发布时间】: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 响应?

【问题讨论】:

    标签: java json spring spring-boot jackson


    【解决方案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;
         }
        

        【讨论】:

          猜你喜欢
          • 2019-07-27
          • 2018-02-13
          • 2017-02-17
          • 2017-12-04
          • 1970-01-01
          • 2018-06-19
          • 1970-01-01
          • 1970-01-01
          • 2021-04-25
          相关资源
          最近更新 更多