我正在制作一个小应用程序,允许用户通过在OpenLibrary上查找ISBN来编目。这个想法是ISBN搜索获取返回的JSON数据并使用它来填充UITextFields,然后用户可以在保存之前进一步编辑。
我在访问嵌套的JSON数据并将其放入UITextField时遇到问题。指责字典的顶级并将其放入UITextFields工作正常,但当我尝试深入时,我得到错误:
无法分配String类型的值?到'String!'类型的值。
它正在采取的JSON数据是:https://openlibrary.org/api/books?bibkeys=0586057242&f&jscmd=data&format=json
以下是代码:
import UIKit
class ItemViewController: UIViewController {
@IBOutlet weak var titleField: UITextField!
@IBOutlet weak var authorField: UITextField!
var session: NSURLSession!
var items = NSObject()
var lookUpID = "0586057242" // This will eventually get passed in from elsewhere.
required init (coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
session = NSURLSession(configuration: config, delegate: nil, delegateQueue: nil)
fetchItem()
}
func fetchItem() {
let requestString = ("https://openlibrary.org/api/books?bibkeys=" + lookUpID + "&f&jscmd=data&format=json")
if let url = NSURL(string: requestString) {
let req = NSURLRequest(URL: url)
let dataTask = session.dataTaskWithRequest(req) {
(data, response, error) in
if data != nil {
var error: NSError?
if let jsonObject = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary {
if let itemDictionary: AnyObject = jsonObject["\(self.lookUpID)"]{
if let id = itemDictionary as? NSObject {
self.items = id
println("\(self.items)")
// Works.
self.titleField.text = itemDictionary["title"] as? String
// Does not work.
self.authorField.text = itemDictionary["authors"]["name"] as? String
}
}
} else {
if let error = error {
println("Error parsing JSON: \(error)")
}
}
} else {
println("Error fetching Item: \(error.localizedDescription)")
}
}
dataTask.resume()
}
}
}
我完全不理解为什么它不起作用,我在访问这些值时做错了吗?
答案 0 :(得分:0)
如果再次检查JSON。作者节点返回数组而不是字典。所以,首先你必须从数组中获取字典,然后你应该尝试从该字典中获取名称节点。
所以,请你试试这个:
self.authorField.text = itemDictionary["authors"][0]["name"] as? String
而不是使用下面的行
self.authorField.text = itemDictionary["authors"]["name"] as? String
答案 1 :(得分:0)
你应该将itemDictionary["authors"]
作为一组作者投射,并获得这样的个人作者名称:
let authors = itemDictionary["authors"]
for author in authors {
self.authorField.text = author as! String
}
或第一条记录
self.authorField.text = itemDictionary["authors"][0]["name"] as! String
答案 2 :(得分:0)
您可以尝试这样的事情:
var names = [String]()
if let authors = itemDictionary["authors"] as? NSArray {
for author in authors {
if let author = author as? NSDictionary,
let name = author["name"] as? String {
names.append(name)
}
}
}
self.authorField.text = join(",", names)
希望这有帮助