Swift 4 从 JSON 中获取相关数据
Posted
技术标签:
【中文标题】Swift 4 从 JSON 中获取相关数据【英文标题】:Swift 4 Get related data from JSON 【发布时间】:2018-07-17 08:33:17 【问题描述】:各位,我想从 JSON 中获取特定 类别 的 图像。我使用 Alamofire 从 JSON 获取数据。我可以将所有图像和所有类别分开。我想要做的是:例如,如果 category == Bar,我想获得 category_image。
case let x where x == "Bar" || x == "Sashimi" || x == "Pizza": imageName = "cafe"
Alamofire.request("http://95.46.59.150:9095/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! [String: Any]?
for (key,value) in objJson
if let result2:[[String:Any]] = value as? [[String:Any]]
for dict in result2
for (key,value) in dict
if key["category"] == "bar"
if key == "category_image"
if let str1: String = value as? String
Allimages.append(str1)
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": "Bar",
"category_image": "http://95.46.59.150:9095/storage/photos/microphone.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": "13.07.2018 13:36:02"
,
【问题讨论】:
您是否发布了错误的json
,因为在接受的答案data
不是array
但在上面的json
它是array
?
@Kamran 我像这样更改第二行...保护让 json = response.value 为? [String : Any] else return guard let data = json["data"] as? [[Sring : Any]] else return
意思是data["category"] as? String
也错了?
@Kamran 如果你愿意,我可以给你发我的代码
@Kamran switch response.result case .success: let json = response.value as? [String : Any] 让 data = json!["data"] as? [[String: Any]] for obj in data! if obj["category"] as? String == condition imageView.downloadedFrom(link: "(obj["category_image"])") case .failure(let error): print("Error: (error)")
【参考方案1】:
无需遍历响应字典。将response.value
转换为字典,从中提取data
对象,将data
转换为字典并检查您需要的任何内容
guard let json = response.value as? [String : Any] else return
guard let data = json["data"] as? [Sring : Any] else return
guard let category = data["category"] as? String else return
if (category == "bar")
let imageUrl = data["category_image"]
【讨论】:
以上是关于Swift 4 从 JSON 中获取相关数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 4 和 Xcode 9 获取 JSON 数据
如何使用 Alamofire,Swift 4 为 UICollectionView 获取 JSON 数据