Spring Boot中使用RestTemplate读取JSON响应

介绍

  • 在构建相互交互的不同系统时,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