Swift 4使用Alamofire解析JSON以获得关键价值

时间:2018-07-13 11:32:48

标签: json swift parsing alamofire

请帮助我解析此JSON结构。我想做的是...获取特定的 id ,为此 id 获得 category_image 。 我尝试使用Alamofire,但目前还没有... 因此,基本上我想得到的是 id ,并与此 id category_image 相关。

我试图用这种方式解析,但是我猜错了方式...

Alamofire.request("http://хх.хх.ххх:хххх/api/v1/institution/get-all-institutions", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON {
        response in
        switch response.result {
        case .success:
            if let objJson = response.result.value as! NSDictionary? {
                for element in objJson {
                    let data = element as! NSDictionary
                    if let array = data["data"] as! NSArray? {
                        for obj in array {
                            print(obj)
                        }
                    }
                }
            }
        case .failure(let error):
            print("Error: \(error)")
        }
    }

JSON:

"data": [
    {
        "id": 1,
        "socials": {
            "vk": "https://vk.com/cafe_teplominsk",
            "instagram": "https://www.instagram.com/teplo_cafe/",
            "facebook": "https://www.facebook.com/cafeteplominsk"
        },
        "short_title": "#тепло",
        "title": "Кафе #тепло",
        "latitude": "53.93820000",
        "longitude": "27.58520000",
        "image": "https://static.relax.by/images/common/catalog_round_logos/d3e4a58f89cdf9ebba2b6759a6e1fe08.jpg",
        "site": "http://cafeteplo.by/",
        "description": "Невозможно представить заведение с более теплой и радушной атмосферой.\r\n\r\nПомимо отличного сервиса и качественного обслуживания кафе #Тепло поразит Вас необыкновенным интерьером в стиле Прованс с абажурами и оригинальными декорациями.\r\n\r\nХорошо там, где #тепло!",
        "phone": "+375 29 639 22 22",
        "work_time": "С 09:00 до 23.00",
        "category": "Кафе",
        "category_image": "http://95.46.99.250:9095/storage/photos/coffee@3x.png",
        "features": "{\"Wi-Fi\": \"Есть\", \"Залы\": \"Зал (85 мест) для некурящих\", \"Сайт\": \"cafeteplo.by\", \"Кухня\": \"Европейская, Итальянская\", \"Метро\": \"Академия наук\", \"Район\": \"Советский\", \"В меню\": \"Пицца, Обеденное меню, Завтраки, Морепродукты, Стейки, Доставка еды, Десерты, Салаты и холодные закуски\", \"Банкет\": \"До 16 чел.\", \"Музыка\": \"Тихая фоновая\", \"Курение\": \"Запрещено\", \"Описание\": \"на портале relax.by\", \"Парковка\": \"Есть\", \"Для детей\": \"Да\", \"Кинотеатры\": \"Октябрь\", \"Предоплата\": \"в размере 30%\", \"Средний счет\": \"$$\", \"Кондиционеры\": \"Есть\", \"Тип заведения\": \"Кафе\", \"способ оплаты\": \"Наличный расчет, Безналичный расчет, Оплата пластиковой картой\", \"Пицца на вынос\": \"Есть\", \"Разливное пиво\": \"Zlatý Bažant, Heineken, Ирландское, Бельгийское, Белорусское\", \"Количество мест\": \"85\", \"Торговые центры\": \"Европа\", \"Большая компания\": \"Да\", \"Дисконтные карты\": \"карта друга со скидкой 10%\", \"Популярные места\": \"парк Дружбы Народов (пл. Бангалор), Логойский тракт\", \"Быстро перекусить\": \"Да\", \"Закрытие заведения\": \"Да\", \"Национальная кухня\": \"Итальянская\", \"Романтический ужин\": \"Да\", \"Предварительный заказ\": \"существует\", \"Условия закрытия залов\": \"50 рублей на человека\", \"Оплата пластиковой картой\": \"Есть\", \"Банкет на открытом воздухе\": \"Нет\", \"Условия закрытия заведения\": \"обсуждается с менеджером\", \"Организационные возможности\": \"Банкетное обслуживание, Вечеринки, Выездное обслуживание, Деловые переговоры, День рождения, Конференция, Корпоративное обслуживание, Организация детских праздников, Презентации, Свадьба, Семинар\", \"Количество залов под мероприятия\": \"1\", \"Что клиент может принести с собой\": \"обсуждается при составлении предзаказа\", \"Владение персоналом иностранными языками\": \"Английский\"}",
        "address": "Минск, ул.Богдановича 138",
        "created_at": "20.07.2017 13:10:42",
        "updated_at": "29.05.2018 16:12:00"
    },
    {
        "id": 2,
        "socials": {
            "vk": "https://vk.com/mustangcafe",
            "instagram": "https://www.instagram.com/cafemustang.minsk/",
            "facebook": null
        },
        "short_title": "Мустанг",
        "title": "Мустанг",
        "latitude": "53.95360000",
        "longitude": "27.41060000",
        "image": null,
        "site": "https://vk.com/mustangcafe",
        "description": "«Мустанг» — загородное барбекю-кафе с 15-летней историей.  Приехать сюда стоит,  чтобы попробовать оригинальные блюда, приготовленные на огне, такие как сочные стейки, сибас на гриле, ребрышки BBQ, шашлык из баранины и многие другие.\r\n\r\nВ кафе «Мустанг» можно проводить различные семейные и корпоративные праздники, свадьбы и выездные регистрации. Максимальное количество гостей — 250 человек (с учетом летней террасы). Есть отдельное банкетное меню.\r\n\r\nЕсть три зала: основной с барной стойкой, VIP и банкетный. Летняя терраса представлена 6 отдельно стоящими беседками. А каждую пятницу и субботу в «Мустанге» проходят вечера живой музыки.",
        "phone": "+375 44 775 37 35",
        "work_time": "С 11:00 до 00:00",
        "category": "Кафе",
        "category_image": "http://95.46.99.250:9095/storage/photos/coffee@3x.png",
        "features": "{\"Wi-Fi\": \"Есть\", \"Залы\": \"Зал 1 (25 мест), Зал 2 (25 мест), Зал 3 (50 мест)\", \"Кухня\": \"Белорусская, Европейская\", \"В меню\": \"Шашлык, Обеденное меню, Выпечка, Стейки\", \"Банкет\": \"До 100 чел.\", \"Другое\": \"Бутылочное Чешское пиво\", \"Музыка\": \"Тихая фоновая, Живая музыка\", \"Курение\": \"Разрешено, есть зал для некурящих\", \"Парковка\": \"Есть\", \"Предоплата\": \"По договоренности\", \"Развлечения\": \"TV с большим экраном, Актёры, Живая музыка, Звёзды эстрады, Танцоры, Танцпол, Шоу-программа\", \"Кондиционеры\": \"Есть\", \"Тип заведения\": \"Кафе\", \"способ оплаты\": \"Наличный расчет, Безналичный расчет\", \"Летняя терраса\": \"Есть\", \"Популярные места\": \"Минское море\", \"Предварительный заказ\": \"Есть\", \"Оплата пластиковой картой\": \"Есть\", \"Банкет на открытом воздухе\": \"Да\", \"Организационные возможности\": \"Банкетное обслуживание, Вечеринки, Выездное обслуживание, Деловые переговоры, День рождения, Конференция, Корпоративное обслуживание, Организация детских праздников, Презентации, Свадьба, Семинар, Фуршет\", \"Количество залов под мероприятия\": \"3\", \"Что клиент может принести с собой\": \"Алкоголь, Кондитерские изделия, Фрукты\", \"Владение персоналом иностранными языками\": \"Английский, Итальянский\"}",
        "address": "Минский р-н, Ждановичский сельсовет, 12 км от трассы Р28 Минск-Молодечно",
        "created_at": "20.07.2017 13:10:42",
        "updated_at": "20.05.2018 20:21:30"
    },

2 个答案:

答案 0 :(得分:1)

尝试一下,我创建了两个数组来存储ID和category_image,例如var AllIds = [Int]() var Allimages = [String]()

  if let objJson = response.result.value as! [String: Any]? {
                for (key,value) in objJson {
                    print(key)
                    if let result2:[[String:Any]] = value as? [[String:Any]]{
                        for dict in result2 {

                            for (key,value) in dict {
                                if key == "id" {
                                    if let str: Int = value as? Int {
                                        self.AllTexts.append(str)
                                    }
                                }
                                if key == "category_image" {
                                    if let str1: String = value as? String {
                                        self.Allimages.append(str1)
                                    }
                                }
                            }
                        }
                    }
                }
            }

答案 1 :(得分:0)

您可以尝试

if let array = data["data"] as? [[String:Any]] {
      for obj in array {
            print(obj["id"],obj["category_image"])
       }
}

//

struct Root:Decodable {
  let  data: [InnerItem]
}

//

struct InnerItem:Decodable {
  let  id: Int
  let  categoryImage:String

  private enum CodingKeys : String, CodingKey {
    case id , categoryImage = "category_image"
  }
}

//

do {
   let items = try JSONDecoder().decode(Root.self, from: dataOfResponse)
   print(items.data)
}
catch {
  print(error)
}