Быстрый поиск значений внутри значений словаря - PullRequest
0 голосов
/ 03 июня 2019

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

URL получает много информации, но не как обычный словарь.

это ОЧЕНЬ упрощенная версия:

["person": 
name: John
height: 187, "fruit": colour: red 
]

и т.д ...

так что я просто хотел бы получить имя человека внутри ключевого человека, но у меня возникают проблемы с поиском этого.

Есть ли способ сделать это? Я пытался JSON Parsing, для циклов, и я застрял.

Edit:

это не словарь внутри словаря. Если вы хотите увидеть, с чем я работаю. Просто скопируйте и вставьте эту ссылку. Это пример того, что я использую. http://itunes.apple.com/lookup?bundleId=com.burbn.instagram

Мне нужно только имя продавца или валюта и т. Д.

Код для прочтения ссылки и ее распечатки:

    override func viewDidLoad() {
    super.viewDidLoad()
    fetchData { (dict, error) in
        print(dict!)
    }
}



func fetchData(completion: @escaping ([String:Any]?, Error?) -> Void) {
    let url = URL(string: link)!

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let data = data else { return }
        do {
            if let array = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String:Any]{
                completion(array, nil)
            }
        } catch {
            print(error)
            completion(nil, error)
        }
    }
    task.resume()
}

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Словарь данных:

let dict = ["person": ["name": "John", "height": "187"], "fruit": ["colour": "red"]]

Предположим, вам нужно имя человека.Таким образом, вы можете сделать это следующим образом.

if let person = dict["person"], let name = person["name"] as? String {
    print (name)
}
0 голосов
/ 03 июня 2019

Данные, которые вы выбираете, - это JSON.Для того, чтобы использовать его, вам придется декодировать его.В Swift рекомендуется использовать JSONDecoder.

Сначала вам нужно определить свою модель, соответствующую модели данных, и настроить ее на соответствие протоколу Codable:

struct App: Codable {
    var sellerName: String
    // Alternatively, if you don't want to use an enum, you can use a String.
    var currency: Currency

    enum Currency: String, Codable {
        case australianDollar = "AUD",
        case britishPound = "GBP",
        case euro = "EUR",
        case hongKongDollar = "HKD",
        case usDollar = "USD"
        // Complete this with all the currency…
    }
}

struct JSONResult: Codable {
    var resultCount: Int
    var results: [App]
}

Как только это будет сделано, вам нужно только отредактировать свой метод fetchData, чтобы он возвращал массив App, заполненный данными, которые вы выбрали.

Версия Swift 4:

func fetchData(completion: @escaping (JSONResult?, Error?) -> Void) {
    guard let url = URL(string: link) else { return }

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let error = error {
            completion(nil, error)
            return
        } else if let data = data {
            do {
                let decoder = JSONDecoder()
                let result = try decoder.decode(JSONResult.self, from: data)
                completion(result, nil)
            } catch {
                print(error)
                completion(nil, error)
            }
        }
    }
    task.resume()
}

Версия Swift 5 с использованием типа Result:

func fetchData(completion: @escaping (Result<JSONResult, Error>) -> Void) {
    guard let url = URL(string: link) else { return }

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let error = error {
            completion(.failure(error))
            return
        } else if let data = data {
            do {
                let decoder = JSONDecoder()
                let result = try decoder.decode(JSONResult.self, from: data)
                completion(.success(result))
            } catch {
                print(error)
                completion(.failure(error))
            }
        }
    }
    task.resume()
}

Дополнительная информация о JSONDecoder

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