介绍
- 在构建相互交互的不同系统时,JSON 是一种常见的数据交换格式。
- 例如,考虑向休息端点发出的 GET 请求。最常见的是 JSON 负载作为响应从服务器返回到客户端。
- 在本文中,我们将学习如何在使用 RestTemplate 时读取此 JSON 对象并将其转换为 Java 对象。
读取 JSON 对象的集合
假设我们有一个休息端点,它返回公司数据库中存在的用户帐户列表。
我们将对端点进行 Rest 调用,读取返回的 JSON 数据,并使用 Spring RestTemplate将其解析为 Java 对象。
执行
我们从端点收到的 JSON 数据如下所示。它是一个 JSON 对象数组。
{ "userId": 1048, "username": "username_fa58221c-b491-40ae-88ce-0c4be7af5903", "password": "password_q1234", "email": "username_fa58221c-b491-40ae-88ce-0c4be7af5903@gmail.com", "createdOn": "2023-05-01T00:00:43.698+00:00", "lastLogin": "2023-05-01T00:00:43.698+00:00", "permission": null }, ....... { "userId": 1124, "username": "username_f05ddbe2-3f36-44c5-9fd5-9df96d123192", "password": "password_q1234", "email": "username_f05ddbe2-3f36-44c5-9fd5-9df96d123192@gmail.com", "createdOn": "2023-05-29T00:38:54.445+00:00", "lastLogin": "2023-05-29T00:38:54.445+00:00", "permission": null }
|
DTO
我们需要创建一个 Account POJO,将 JSON 属性映射到 Java 属性。
public class Account { private int userId; private String username; private String password; private String email; private Timestamp createdOn; private Timestamp lastLogin; private Permission permission; // getters and setters }
|
服务
现在,我们的服务端点调用其余端点并将响应读取为帐户数组。这里的 Account 是一个 POJO,它映射到我们从 JSON 响应收到的所有参数。
要读取帐户集合,我们可以将其作为帐户数组来读取。
@Service public class AccountService { @Autowired private RestTemplate restTemplate; @Value("http://localhost:8080/accounts") private String url; public Account getAllAccounts() { return restTemplate .getForObject(url, Account.class); } }
|
如果我们打印映射的响应:
Accounts: Account{userId=1048, username='username_fa58221c-b491-40ae-88ce-0c4be7af5903', password='password_q1234', email='username_fa58221c-b491-40ae-88ce-0c4be7af5903@gmail.com', createdOn=2023-04-30 20:00:43.698, lastLogin=2023-04-30 20:00:43.698, permission=null} ..
|
读取嵌套 JSON 对象的集合
现在假设我们收到 JSON 对象的嵌套集合。例如,我们可以拥有一个客户集合,其中每个客户都可以拥有一个发给他们的信用卡集合。
{ "id": 10, "name": "jenny", "creditCard": { "id": 11, "cardNumber": "2344323432112222", "expiryDate": "2023-04-10" }, { "id": 10, "cardNumber": "2344323432112422", "expiryDate": "2023-04-12" }, { "id": 13, "cardNumber": "4111111111111111", "expiryDate": "2023-04-11" }, { "id": 14, "cardNumber": "4111111131111111", "expiryDate": "2023-05-11" }, { "id": 15, "cardNumber": "4111111131119111", "expiryDate": "2023-05-12" }, { "id": 17, "cardNumber": "378282246310005", "expiryDate": "2023-05-09" }, { "id": 18, "cardNumber": "378282246710005", "expiryDate": "2024-05-09" }, { "id": 21, "cardNumber": "4111111131119", "expiryDate": "2025-05-12" } }
|
执行
对于嵌套对象,我们可以遵循类似的方法,将响应读取为客户数组。
现在每个客户可以拥有多张信用卡,因此为了正确映射响应,我们需要设置 POJO,以便客户包含信用卡集合。
POJO
我们的 POJO 需要包含 JSON 响应中的属性。
如果 JSON 和 Java 之间的属性名称不同,那么我们需要在 Java 属性上使用 @JsonProperty(“”) 才能正确映射。
public class Customer{ private Long id; private String name; @JsonProperty("creditCard") private List<CreditCard> creditCards; // getters , setters .. } public class CreditCard { private Long id; private String cardNumber; private String expiryDate; }
|
服务
服务类使用 RestTemplate 调用其余端点,该端点还使用映射器类将响应映射到 POJO。
这里我们使用客户数组,因为 JSON 包含拥有信用卡的客户集合。
@Service public class CustomerService { @Autowired private RestTemplate restTemplate; @Value("http://localhost:8080/customer/all") private String url; public Customer getAllCustomers() { return restTemplate .getForObject(url, Customer.class); } }
|
如果我们打印映射的响应:Customers: Customer{id=10, name='jenny', creditCards=CreditCard{id=11, cardNumber='2344323432112222', expiryDate='2023-04-10'}, ....
结论
在本文中,我们介绍了如何使用 Spring RestTemplate读取 JSON 响应。我们研究了 JSON 对象的读取集合以及嵌套集合。
注意:虽然 RestTemplate 被广泛使用 RestClient ,但自 Spring 5 以来已被弃用,取而代之的是 WebClient