导入Firebase会导致JSON获取不明确



我一直在我的View Controller中获取JSON,我需要一个函数来将同一VC中的数据添加到firebase,所以导入了firebase(Pods firebase core、auth和firestore),现在它在获取JSON时给了我一个错误,即它不明确地使用了"subscript">

func getDetails(link: URL!) {
var plot : String = " "
let task = URLSession.shared.dataTask(with: link!) { (data, response, error) in
if error != nil
{
print("error")
}
else
{
if let content = data
{
do
{
//JSON results
let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableLeaves) as AnyObject

//myJson ~~~ ["Plot"]  Ambiguous use of 'subscript'
plot = myJson["Plot"] as! String
}

catch
{
print("error in JSONSerialization")
}
}
}
}
task.resume()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
self.plot.text = plot
})
}

我希望保持选择JSON的"Plot"值的能力,并让firebase运行

您的问题是将结果从JSONSerialization转换为AnyObject。如果您希望能够使用下标,那么在您的情况下,应该将结果向下转换为字典类型,例如[String:Any]

if let myJson = try JSONSerialization.jsonObject(with: content, options: .mutableLeaves) as? [String:Any] {
// plot = myJson["Plot"] as? String ?? "Default value"
}

无论如何,还是学习一些关于Codable的知识,并使用它来代替JSONSerialization。只需创建符合Decodable协议的类/结构,然后使用JSONDecoderData对象进行解码。

以下是我如何重写这个方法,给定一个代表服务器响应的ModelObject结构或类。

func getDetails(link: URL!) {
var plot = " "
let group = DispatchGroup()
group.enter()
let task = URLSession.shared.dataTask(with: link!) { (data, response, error) in
defer { group.leave() }
guard error == nil else {
print(error)
return
} 
if let content = data {
do {
let modelObject = try JSONDecoder().decode(ModelObject.self, from: data)
plot = modelObject.plotString
}
catch {
print(error)
}
}
}
task.resume()
group.notify(queue: DispatchQueue.main) {
self.plot.text = plot
}
}

最新更新