需要在Swift代码中解析JSON解析
问题描述:
我有以下方法可以在从开源端点解析基本json数据时正常工作。我的问题是,在纠正编译错误,我有以下行,我需要帮助理解:需要在Swift代码中解析JSON解析
let movieDictionary = json??["Search"] as! [[String:Any]]
为什么我需要有“?” ?我想我需要'?'或'!',但为什么'??'?如果我删除其中一个'?'或者替换'??'用'!',Xcode坚持要添加另一个'?',然后我的代码编译。
我的全方法如下:
func fetchMovies() {
let url = NSURL(string: "http://www.omdbapi.com/?s=batman")
URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in
if error != nil {
print(error)
return
}
do {
let json = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any]
let movieDictionary = json??["Search"] as! [[String:Any]]
for movie in movieDictionary {
print(movie["Title"]!)
}
} catch let jsonError {
print(jsonError)
}
}.resume()
}
答
第一?
从try?
来了。当谈到一个抛出功能,你有3个选择把它写:
-
try
:如果函数调用失败,转到catch
块 -
try?
:如果函数调用失败,返回nil
也不要去catch
块。因此,返回类型为Optional<T>
-
try!
:如果函数调用失败,崩溃的应用程序
第二?
自投来了:as? [String:Any]
。您要求编译器将其转换为[String: Any]
,如果它不是可转位的,则返回nil
。
如果你想摆脱他们两个:
let url = NSURL(string: "http://www.omdbapi.com/?s=batman")
URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in
guard error == nil else {
print(error!)
return
}
do {
guard let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any] else {
print("Unexpected JSON format")
return
}
let movieDictionary = json["Search"] as! [[String:Any]]
for movie in movieDictionary {
print(movie["Title"]!)
}
} catch let jsonError {
print(jsonError)
}
}.resume()
非常感谢您的解决方案! – syedfa