在字典的值内快速搜索值

时间:2019-06-03 04:32:47

标签: json swift parsing dictionary

我有我的应用程序提取的URL。它会打印带有两个键的字典,但是其中一个键是我想从我的应用程序中获取的很多信息。

URL可获取很多信息,但不能作为常规词典使用。

这是一个非常简化的版本:

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

等...

因此,我只想获取关键人物内的人物姓名,但我很难找到它。

有没有办法做到这一点?我一直在尝试JSON解析,以进行循环,但我陷入了困境。

编辑:

它不是词典中的词典。如果您想看看我在做什么。只需复制并粘贴此链接。这是我正在使用的示例。 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 :(得分:-1)

您要获取的数据是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()
}

使用Result类型的Swift 5版本:

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

More information about JSONDecoder

答案 1 :(得分:-1)

词典数据为:

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

假设您需要此人的 姓名 。因此,您可以通过以下方式进行操作。

if let person = dict["person"], let name = person["name"] as? String {
    print (name)
}