извлечение контактов из учетной записи с помощью функции высокого порядка

#json #swift #filter

#json #swift #Фильтр

Вопрос:

Как я могу извлечь список контактов и отображаемых имен учетной записи из объекта accounts JSON с использованием функций высокого порядка. мне нужно, чтобы имя и фамилия контакта были извлечены и сглажены в одном массиве

мой объект swift

   struct Account: Codable {
        var accountID, displayName, managedByStakeholderID, id: String?
        var contacts: [Contact]?
    }
struct Contact: Codable {

    var firstName: String?
    var lastName: String?
}
  

JSON

     {
       "Accounts":[
          {
             "AccountID":"ef391c24-ad5b-4dca-98ae-b55793dfc029",
             "Contacts":[
                {
                   "AccountID":"ef391c24-ad5b-4dca-98ae-b55793dfc029",
                   "AvatarImage":"",
                   "ContactEmail":"cbacon@associates.com",
                   "ContactID":"f74d3810-625f-43d4-afd4-89346a73f807",
                   "ContactTitle":"Chief Executive Officer",
                   "DisplayName":"Ch  Bacon",
                   "FirstName":"Ch",
                   "LastName":"Baco",
                   "ManagedByStakeholderID":"97e5f0d5-df0d-48fe-bbbb-cccf251f4175",
                   "Notes":"OWNER",
                   "Roles":[
                      {
                         "RoleEnvironmentName":"",
                         "RoleEnvironmentTenantName":"",
                         "RoleID":"3a824b1e-26d6-41c5-8336-4b79f0962c38",
                         "RoleName":"Environment Administrator"
                      }
                   ],
                   "StakeholderID":"97e5f0d5-df0d-48fe-bbbb-cccf251f4175",
                   "id":"f74d3810-625f-43d4-afd4-89346a73f807"
                }
             ],
             "DisplayName":"Chris Associates Ltd."
          },
          {
             "AccountID":"C31ACAD6-0E5D-43E0-B1A2-E51FD46BFE3A",
             "Contacts":[
                {
                   "AccountID":"C31ACAD6-0E5D-43E0-B1A2-E51FD46BFE3A",
                   "AvatarImage":"http://www.image.com/",
                   "ContactEmail":"jhgjhg@njkjk.com",
                   "ContactID":"28fad61f-9a47-41db-888e-19d66de96638",
                   "ContactTitle":"",
                   "DisplayName":"fvdfvdf",
                   "FirstName":"dfvdfv",
                   "LastName":"dfvdfv",
                   "ManagedByStakeholderID":"97e5f0d5-df0d-48fe-bbbb-cccf251f4175",
                   "Notes":"",
                   "Roles":[
                      
                   ],
                   "StakeholderID":"43d3af87-fd21-404c-9af6-2998e401fcb8",
                   "id":"28fad61f-9a47-41db-888e-19d66de96638"
                }
             ],
             "DisplayName":"adidas "
          },
          {
             "AccountID":"A4FBDC11-AB07-47BD-8364-0B1D81D8E38F",
             "Contacts":[
                {
                   "AccountID":"A4FBDC11-AB07-47BD-8364-0B1D81D8E38F",
                   "AvatarImage":"http://www.image.com/",
                   "ContactEmail":"jeff@linkedin.com",
                   "ContactID":"c205d05d-c4cf-46b2-a9fd-e85af2f317b9",
                   "ContactTitle":"",
                   "DisplayName":"Jeff Weiner",
                   "FirstName":"Jeff",
                   "LastName":"Weiner",
                   "ManagedByStakeholderID":"97e5f0d5-df0d-48fe-bbbb-cccf251f4175",
                   "Notes":"",
                   "Roles":[
                      
                   ],
                   "StakeholderID":"c6fc9b6e-f857-4ca1-8352-dc55b05a9373",
                   "id":"c205d05d-c4cf-46b2-a9fd-e85af2f317b9"
                }
             ],
             "DisplayName":"LinkedIn. Inc "
          }
       ]
    }
  

Комментарии:

1. Это зависит от того, как вы хотите их извлечь (все или отфильтрованные) и какой результат вы ожидаете.

2. мне нужно, чтобы имя и фамилия контакта были извлечены и сглажены в одном массиве

3. Вместо этого добавьте эту информацию в вопрос, а также включите определение контакта

Ответ №1:

Вы можете получить свойство response accounts и сопоставить контакты:

 struct Response: Decodable {
    let accounts: [Account]
    enum CodingKeys: String, CodingKey {
        case accounts = "Accounts"
    }
}
  

 struct Account: Decodable {
    let accountID, displayName, managedByStakeholderID, id: String?
    let contacts: [Contact]
    enum CodingKeys: String, CodingKey {
        case accountID = "AccountID", displayName = "DisplayName", managedByStakeholderID = "ManagedByStakeholderID", id = "ID", contacts = "Contacts"
    }
}
  

 struct Contact: Decodable {
    let firstName: String
    let lastName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "FirstName", lastName = "LastName"
    }
}
  

 let jsonResponse = """
{
      "Accounts":[
         {
            "AccountID":"ef391c24-ad5b-4dca-98ae-b55793dfc029",
            "Contacts":[
               {
                  "AccountID":"ef391c24-ad5b-4dca-98ae-b55793dfc029",
                  "AvatarImage":"",
                  "ContactEmail":"cbacon@cpbamp;associates.com",
                  "ContactID":"f74d3810-625f-43d4-afd4-89346a73f807",
                  "ContactTitle":"Chief Executive Officer",
                  "DisplayName":"Ch  Bacon",
                  "FirstName":"Ch",
                  "LastName":"Baco",
                  "ManagedByStakeholderID":"97e5f0d5-df0d-48fe-bbbb-cccf251f4175",
                  "Notes":"OWNER",
                  "Roles":[
                     {
                        "RoleEnvironmentName":"",
                        "RoleEnvironmentTenantName":"",
                        "RoleID":"3a824b1e-26d6-41c5-8336-4b79f0962c38",
                        "RoleName":"Environment Administrator"
                     }
                  ],
                  "StakeholderID":"97e5f0d5-df0d-48fe-bbbb-cccf251f4175",
                  "id":"f74d3810-625f-43d4-afd4-89346a73f807"
               }
            ],
            "DisplayName":"Chris Associates Ltd."
         },
         {
            "AccountID":"C31ACAD6-0E5D-43E0-B1A2-E51FD46BFE3A",
            "Contacts":[
               {
                  "AccountID":"C31ACAD6-0E5D-43E0-B1A2-E51FD46BFE3A",
                  "AvatarImage":"http://www.image.com/",
                  "ContactEmail":"a@mail.com",
                  "ContactID":"28fad61f-9a47-41db-888e-19d66de96638",
                  "ContactTitle":"",
                  "DisplayName":"fvdfvdf",
                  "FirstName":"dfvdfv",
                  "LastName":"dfvdfv",
                  "ManagedByStakeholderID":"97e5f0d5-df0d-48fe-bbbb-cccf251f4175",
                  "Notes":"",
                  "Roles":[
                     
                  ],
                  "StakeholderID":"43d3af87-fd21-404c-9af6-2998e401fcb8",
                  "id":"28fad61f-9a47-41db-888e-19d66de96638"
               }
            ],
            "DisplayName":"adidas "
         },
         {
            "AccountID":"A4FBDC11-AB07-47BD-8364-0B1D81D8E38F",
            "Contacts":[
               {
                  "AccountID":"A4FBDC11-AB07-47BD-8364-0B1D81D8E38F",
                  "AvatarImage":"http://www.image.com/",
                  "ContactEmail":"jeff@linkedin.com",
                  "ContactID":"c205d05d-c4cf-46b2-a9fd-e85af2f317b9",
                  "ContactTitle":"",
                  "DisplayName":"Jeff Weiner",
                  "FirstName":"Jeff",
                  "LastName":"Weiner",
                  "ManagedByStakeholderID":"97e5f0d5-df0d-48fe-bbbb-cccf251f4175",
                  "Notes":"",
                  "Roles":[
                     
                  ],
                  "StakeholderID":"c6fc9b6e-f857-4ca1-8352-dc55b05a9373",
                  "id":"c205d05d-c4cf-46b2-a9fd-e85af2f317b9"
               }
            ],
            "DisplayName":"LinkedIn. Inc "
         }
      ]
   }
"""
  

 do {
    let contacts = try JSONDecoder().decode(Response.self, from: Data(jsonResponse.utf8)).accounts.flatMap(.contacts)
    print(contacts) // [__lldb_expr_79.Contact(firstName: "Ch", lastName: "Baco"), __lldb_expr_79.Contact(firstName: "dfvdfv", lastName: "dfvdfv"), __lldb_expr_79.Contact(firstName: "Jeff", lastName: "Weiner")]
} catch { print(error) }