#java #spring-boot #collections
Вопрос:
Я создал api для извлечения всех сведений о экземплярах Ec2, но я не знаю, как сделать правильный ответ на него и отправить, в настоящее время я использую список массивов, но он возвращает массивы массива. Как сделать идеальный ответ, пожалуйста, помогите
Мой код —
public ArrayList<ArrayList<String>> getAllInstances() {
boolean done = false;
ArrayList<ArrayList<String>> instances = new ArrayList<>();
DescribeInstancesRequest request = new DescribeInstancesRequest();
while (!done) {
DescribeInstancesResult response = ec2Client.describeInstances(request);
for (Reservation reservation : response.getReservations()) {
for (Instance instance : reservation.getInstances()) {
ArrayList<String> list = new ArrayList<String>();
list.add(instance.getInstanceId());
list.add(instance.getInstanceType());
list.add(instance.getState().getName());
System.out.printf(
"Found instance with id %s, "
"AMI %s, "
"type %s, "
"state %s "
"and monitoring state %s",
instance.getInstanceId(),
instance.getImageId(),
instance.getInstanceType(),
instance.getState().getName(),
instance.getMonitoring().getState());
instances.add(list);
}
}
request.setNextToken(response.getNextToken());
if (response.getNextToken() == null) {
done = true;
}
System.out.println("flag stats = " done);
}
return instances;
}
Ответ —
[["i-09xxxxxxf5b82","t2.nano","running"],["i-03ddxxxxx956d099","t2.micro","running"]]
Как сделать его правильным json-ответом.
Комментарии:
1. Почему бы не использовать сопоставление объектов json с использованием отдельного класса для ответа, таким образом, у вас будет правильный список каждого экземпляра с правильным сопоставлением значений ключа? кроме того, какой ответ вам нужен? здесь необходима некоторая ясность
2. Я хочу, чтобы этот ответ был таким: [{«id»: «132sdsxxxx», «type»: «t2.nano», «status’, «running»}, {…}]
3. вместо ArrayList<ArrayList<String>> вам следует попробовать List<myInstance> ; здесь myInstance может наследовать свойства экземпляра только те, которые вам нужны; но вы также можете использовать экземпляр напрямую, у него просто будут дополнительные параметры
Ответ №1:
Я бы создал новый класс с полями, которые вам нужно вернуть, т.Е.:
public class InstanceDetails {
private String instanceId;
private String instanceType; // Could use an enum for this if you know all possible values
private String state;
// further fields as required
// constructor / getters / setters
}
Затем вы можете создать объекты этого класса вместо своего списка и добавить их в список экземпляров. Таким образом, ваше определение функции будет:
public List<InstanceDetails> getAllInstances() {
}
(В качестве примечания, возможно, вы сделали это по какой-то причине, но я обычно использую тип абстрактного списка в определениях методов, вы все равно можете вернуть ArrayList внутри метода).
Вам также может понадобиться библиотека JSON (например, Jackson) для анализа выходных данных в зависимости от того, куда вы их отправляете.