Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 嵌套JSON访问/向UITextField分配值_Ios_Swift - Fatal编程技术网

Ios 嵌套JSON访问/向UITextField分配值

Ios 嵌套JSON访问/向UITextField分配值,ios,swift,Ios,Swift,我正在制作一个小应用程序,允许用户通过在OpenLibrary上查找ISBN来编目书籍。其思想是ISBN搜索获取返回的JSON数据,并使用它填充UITextFields,用户可以在保存之前进一步编辑这些字段 我在访问嵌套的JSON数据并将其放入UITextField时遇到问题。指责字典的顶层并将其放入UITextFields可以很好地工作,但当我尝试深入时,我得到了错误: 无法指定字符串类型的值?到类型为“String!”的值 它获取的JSON数据如下所示: 代码如下: import UIKit

我正在制作一个小应用程序,允许用户通过在OpenLibrary上查找ISBN来编目书籍。其思想是ISBN搜索获取返回的JSON数据,并使用它填充UITextFields,用户可以在保存之前进一步编辑这些字段

我在访问嵌套的JSON数据并将其放入UITextField时遇到问题。指责字典的顶层并将其放入UITextFields可以很好地工作,但当我尝试深入时,我得到了错误:

无法指定字符串类型的值?到类型为“String!”的值

它获取的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()
        }
    }

}

我一点也不明白它为什么不起作用,我访问值的方式是否有问题?

如果您再次检查JSON。作者节点正在返回数组而不是字典。因此,首先您必须从数组中获取字典,然后您应该尝试从该字典中获取名称节点

所以,你可以试试这个:

self.authorField.text = itemDictionary["authors"][0]["name"] as? String
而不是使用下面的行

self.authorField.text = itemDictionary["authors"]["name"] as? String

如果您再次检查JSON。作者节点正在返回数组而不是字典。因此,首先您必须从数组中获取字典,然后您应该尝试从该字典中获取名称节点

所以,你可以试试这个:

self.authorField.text = itemDictionary["authors"][0]["name"] as? String
而不是使用下面的行

self.authorField.text = itemDictionary["authors"]["name"] as? String

您应该将
itemDictionary[“authors”]
转换为一个作者数组,并获得如下的作者姓名:

let authors = itemDictionary["authors"]
for author in authors {
   self.authorField.text = author as! String
}
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)
还是第一张唱片

self.authorField.text = itemDictionary["authors"][0]["name"] as! String

您应该将
itemDictionary[“authors”]
转换为一个作者数组,并获得如下的作者姓名:

let authors = itemDictionary["authors"]
for author in authors {
   self.authorField.text = author as! String
}
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)
还是第一张唱片

self.authorField.text = itemDictionary["authors"][0]["name"] as! String

您可以尝试以下方法:

let authors = itemDictionary["authors"]
for author in authors {
   self.authorField.text = author as! String
}
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)

希望这有帮助

您可以尝试以下方法:

let authors = itemDictionary["authors"]
for author in authors {
   self.authorField.text = author as! String
}
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)


希望这能有所帮助

你知道两者的区别吗?还有!在swift中,为什么要将非可选值赋给声明为可选的变量?这些错误只说明了其中的错误。是的,但我不明白的是为什么第一个
self.titleField.text=itemDictionary[“title”]as?字符串
可以工作,但self.authorField.text=itemDictionary[“authors”][“name”]as?字符串没有。它似乎是一个作者数组。因此,您可能会重复提取所有作者的姓名。您知道两者之间的区别吗?还有!在swift中,为什么要将非可选值赋给声明为可选的变量?这些错误只说明了其中的错误。是的,但我不明白的是为什么第一个
self.titleField.text=itemDictionary[“title”]as?字符串
可以工作,但self.authorField.text=itemDictionary[“authors”][“name”]as?字符串没有。它似乎是一个作者数组。因此,您可能会重复提取所有作者的姓名。您知道两者之间的区别吗?还有!在swift中,为什么要将非可选值赋给声明为可选的变量?这些错误只说明了其中的错误。是的,但我不明白的是为什么第一个
self.titleField.text=itemDictionary[“title”]as?字符串
可以工作,但self.authorField.text=itemDictionary[“authors”][“name”]as?字符串没有。它似乎是一个作者数组。因此,您可能会重复提取所有作者的姓名,这仍然会给我与上面相同的错误。无法将“字符串”类型的值分配给“字符串”类型的值我只是不明白为什么:/这仍然给了我与上面相同的错误。无法将“字符串”类型的值分配给“字符串”类型的值我只是不明白为什么:/这仍然给了我与上面相同的错误。无法将“字符串”类型的值分配给“字符串”类型的值我只是不明白为什么这是一种享受,谢谢!作为后续措施,当我运行应用程序时,如果我太快地点击UITextFields,应用程序会崩溃,并出现一个异常
“NSInternalInconsistencyException”,原因:“-[UIKeyboardTaskQueue WaitUntillallTasksRefiefined]可能只能从主线程调用。”
如果我等待很短时间,然后单击它不会崩溃。有没有一种简单的方法来防止这种崩溃发生?乍一看,你可以考虑添加布尔var <代码>加载< /代码>。加载时将其设置为
true
,然后设置为
false
。如果
加载
,则不要启动其他进程。考虑一下这是一个普通的模式,不确定它是否适合你的其他问题。作为后续措施,当我运行应用程序时,如果我太快地点击UITextFields,应用程序会崩溃,并出现一个异常
“NSInternalInconsistencyException”,原因:“-[UIKeyboardTaskQueue WaitUntillallTasksRefiefined]可能只能从主线程调用。”
如果我等待很短时间,然后单击它不会崩溃。有没有一种简单的方法来防止这种崩溃发生?乍一看,你可以考虑添加布尔var <代码>加载< /代码>。加载时将其设置为
true
,然后设置为
false
。如果
加载
,则不要启动其他进程。考虑一下这是一个普通的模式,不确定它是否适合你的其他问题。作为后续措施,当我运行应用程序时,如果我太快地点击UITextFields,应用程序会崩溃,并出现一个异常
“NSInternalInconsistencyException”,原因:“-[UIKeyboardTaskQueue WaitUntillallTasksRefiefined]可能只能从主线程调用。”
如果我等待很短时间,然后单击它不会崩溃。有没有一种简单的方法来防止这种崩溃发生?乍一看,你可以考虑添加布尔var <代码>加载< /代码>。加载时将其设置为
true
,然后设置为
false
。如果
加载
,则不要启动其他进程。考虑这是一个通用模式,不确定它是否适合您的其他问题。