Прежде всего, созданный вами объект Item не подходит для JSON, который вы хотите получить. Насколько я вижу, у объекта Item есть свойство типа Адреса, которое хорошо для отслеживания address1 и address2, но если вы хотите получить результат JSON выше, вам нужен список адресов в качестве свойства.
Затем, если вы хотите сохранить элементы списка и идентификаторы списка и предположить, что вы собираете все элементы с одинаковым именем, код должен измениться следующим образом:
List<Item> items= new ArrayList<Item>();
List<String> ids = new ArrayList<String>();
for (Record record: records) { // Loop the rows show above
if(!ids .contains(record.getId())) { //prevent duplicate Item
Item item = new Item();
item.setName(record.getSurname());
Address address = new Address();
address.setAddress1 = record.getAddress1();
address.setAddress2 = record.getAddress2();
List<Address> addrList = new ArrayList<Address>();
addrList.add(address);
item.setAddreses(addrList);
items.add(item); // add the item into items
} else {
for (Item it: items) {
if(it.getName().equals(record.getSurname()) {
Address addr = new Address();
addr.setAddress1 = record.getAddress1();
addr.setAddress2 = record.getAddress2();
it.getAddresses().add(addr);
}
}
}
Ids.add(record.getId());
}
На самом деле это не лучшее решение, в таких случаях вместо того, чтобы использовать структуры данных List, я предлагаю перейти на карту, которая по определению избегает дубликатов.