嵌套的JSON访问/为UITextField分配值

时间:2015-06-03 10:10:25

标签: ios swift

我正在制作一个小应用程序,允许用户通过在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()
        }
    }

}

我完全不理解为什么它不起作用,我在访问这些值时做错了吗?

3 个答案:

答案 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)

希望这有帮助