首页 > 解决方案 > 如何创建一个从用户数组返回 JSON 的 @Restcontroller

问题描述

一段时间以来,我一直在努力解决这个挑战。我是一名 JavaScript 开发人员,但一直在尝试 Spring Boot 和 Java,但遇到了问题。在下面的代码中,我需要弄清楚如何编写@RestController逻辑以从下面在 User 类中创建的用户列表中返回 JSON。我不知道该怎么做,因为这对我来说是全新的。

package usersExample;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

@RestController
public class UsersController {
    /* Please insert your code here to make the tests pass */
}

@Service
class UserService {
    public List<User> all() {
        List<User> users = new ArrayList<User>();
        users.add(new User("Bob"));
        users.add(new User("Christina"));
        users.add(new User("Steve"));
        return users;
    }
}

class User {
  private final String name;
  public User(String name) {
      this.name = name;
  }
  public String getName() {
      return name;
  }
}

标签: javaspring

解决方案


由于您使用@RestController的是 ,因此返回值已经是 JSON(spring-boot 进行转换而无需添加额外的依赖项,因为它已经包含 Jackson 库)。您可以简单地在您的控制器中创建一个方法,该方法将返回一个List用户。关于您的代码的一条评论:使用正确的方法名称,例如findAll()代替all().

@GetMapping("/find-all")
public List<User> findAll()
{
      return userService.findAll();
}

PS:如果您添加的代码与您正在运行的代码相同,我建议您为Userand创建单独的类UserService

编辑:简单对象到 JSON 对象的转换是使用 getter 完成的。它是如何工作的?让我们举个例子:

class User {
  private final String name;
  public String getName() {
      return name;
  }
}

转换器将查找以关键字开头的方法get,并将之后的所有内容设置为属性名称,其中第一个字母转换为小写,这意味着唯一属性(因为您只有 1 个 getter)将如下所示name : -value here-

现在您可能会问一些问题,例如:

1)

问:如果您将getName()方法更改为 ,会发生什么情况getname()

A:会一样的

2)

问:如果你不为字段提供 getter 会发生什么?

A:该字段不会转换为 JSON 属性

3)

问:如果您将getName()方法更改为 ,会发生什么情况getMyName()

A:属性名称将是myName: -value-

所以,如果已经说了这些,如果你想改变你的 JSON 结构,有很多解决方案:

1)更改吸气剂名称(不推荐)

2) 使用@JsonProperty 注释。例如:

private String name;

@JsonProperty("name")
public String thismethodwontworkwithoutjsonproperty() {
    return this.name;
}

3) 创建一个 DTO 对象UserDTO并返回 this 而不是User. 在您的控制器中,您可以将用户转换为 userDTO 对象。

public class UserDTO {
   private String fullName; 
   //getter; setter;
}

public class User {
  private String firstName;
  private String lastName;
  //getter;setter;
}

最终,您可以像这样进行转换:

@GetMapping("/getUser")
public User returnUser() {
    User user = new User();
    user.setFirstName("Stack");
    user.setLastName("Overflow");
    UserDto userDto = convertUser(user);
    return userDto;
}

private UserDTO convertUser(User user) {
    UserDTO userDTO = new UserDTO();
    userDTO.setFullName(user.getFirstName() + " " + user.getLastName());
    return userDTO;
}

但我建议您构建您的应用程序并添加一个facade层来进行此转换,而不是convertUser()在控制器中创建方法。

输出:

{
  "fullName":"Stack Overflow";
}

推荐阅读