我有我的应用程序提取的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()
}
答案 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()
}
答案 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)
}