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