Как мне отделить значения словаря JSON и поместить их в массив Swift? - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь вернуть значения строки словаря. Возвращается как:

категории: [yelp1.Zom2 (категории: yelp1.Zom3 (имя: «Доставка»)), yelp1.Zom2 (категории: yelp1.Zom3 (имя: «Dine-out»))) ....]

Как бы я мог вернуть только такие значения имени, как "Доставка" и "Выход из игры"? // yelp1 это просто имя файла

ОБРАЗЕЦ ДАННЫХ JSON

{
    "categories": [
    {
      "categories": {
        "id": 1,
        "name": "Delivery"
      }
    },
    {
      "categories": {
        "id": 2,
        "name": "Dine-out"
      }
    },

ЭТО МОИ СТРУКТЫ

struct Zom3:Codable{
    let name:String
}
struct Zom2:Codable{

    //let category_id:Int?
    let categories: Zom3

}
struct Zom:Codable{

    //let category_id:Int?
    let categories: [Zom2]

}

Я пытался декодировать Zom3, потому что там находится значение имени, но в нем указано, что ключ не найден. Это не позволит мне перебрать цикл for, чтобы хотя бы получить каждый элемент словаря отдельно.

override func viewDidLoad() {
    super.viewDidLoad()

    let urlName = "https://developers.zomato.com/api/v2.1/categories"
    let url = URL(string: urlName)
    var urlReq = URLRequest(url: url!)
    urlReq.httpMethod = "GET"
    urlReq.addValue("application/json", forHTTPHeaderField: "Accept")
    urlReq.addValue(zomatoKey, forHTTPHeaderField: "user_key")

    let task = URLSession.shared.dataTask(with: urlReq) { (data, response, error) in
        guard let data = data else {return}

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

1 Ответ

0 голосов
/ 26 апреля 2019

Из того, что вы написали, похоже, что вы выводите из строки "print (items)".Если это так, то объект, который вы назвали "items", является структурой верхнего уровня "Zom".Чтобы получить нижний уровень "name", я думаю, вам нужен цикл for в разделе "let items = try ...";(вместо «print (items)»)

var arrayOfNames: [String] = []
let zoms = item.categories
for item in zoms {
    let possibleName = item.categories?.name
    if let name = possibleName {
         arrayOfNames.append(name)
    }
}
print(arrayOfNames)

Если я не допустил ошибок, следует создать массив имен и распечатать «Delivery, Dine-Out»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...