Цикл строк с использованием POJO для создания JSON с отсутствующими элементами

#java #nested-loops

#java #вложенные циклы

Вопрос:

У меня есть следующие строки из базы данных :

 ID    name   address1        address 2
-----------------------------------
123   Edvin  Hong Kong       Hong Kong
123   Edvin  Taipei          Taiwan
124   Advin  Bangkok         Thailand
-----------------------------------
  

Я хочу получить следующий результат в формате JSON:

 "Item":[  
  {  "name": "Edvin"
     "addresses": [
        {
          "address1": "Hong Kong"
          "address2": "Hong Kong"
         } ,
        {
          "address1": "Taipei"
          "address2": "Taiwan"
        }
      ]
   },
   {  "name": "Advin"
     "addresses": [
        {
          "address1": "Bangkok"
          "address2": "Thaland"
         }
      ]
   }
]
  

Я пытался сделать это:

 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();
              item.setAddreses(address);
              items.add(item); // add the item into items
           }
           Ids.add(record.getId());
        }
  

В приведенном выше коде я могу получить только первый адрес имени элемента Edvin, как я могу получить второй адрес для Edvin?

Ответ №1:

Прежде всего, созданный вами объектный элемент не подходит для JSON, который вы хотите получить. Насколько я могу видеть, объект Item имеет свойство типа Addresses, которое позволяет отслеживать 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());
    }
  

На самом деле не лучшее решение, в таких случаях, как это, вместо использования этих структур данных списка я предлагаю перейти к карте, которая по определению позволяет избежать дубликатов.