java - 如何创建一个从用户数组返回 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;
}
}
解决方案
由于您使用@RestController
的是 ,因此返回值已经是 JSON(spring-boot 进行转换而无需添加额外的依赖项,因为它已经包含 Jackson 库)。您可以简单地在您的控制器中创建一个方法,该方法将返回一个List
用户。关于您的代码的一条评论:使用正确的方法名称,例如findAll()
代替all()
.
@GetMapping("/find-all")
public List<User> findAll()
{
return userService.findAll();
}
PS:如果您添加的代码与您正在运行的代码相同,我建议您为User
and创建单独的类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";
}
推荐阅读
- python - Python 字谜字符串
- flutter - 显示尽可能多的元素而不会溢出
- typescript - 索引表达式不是“数字”类型
- javascript - sequelize 验证多列 [this.column got undefined]
- android - 管理 Google Play 订阅不起作用
- keras - “连接”层需要具有匹配形状的输入,连接轴除外
- javascript - Lua表到js数组
- c# - Stimulsoft 中的 Parent Key 和 ChildKey 是相同的
- html - document.getElementById 在 Vue2 组件中未定义......因为滥用手表?
- python - 线性回归器无法预测一组值;错误:ValueError:形状(100,1)和(2,1)未对齐:1(dim 1)!= 2(dim 0)