#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) }