Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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
键嵌套数组和/或字典的Swift JSON对象 我是一名学生,希望使用正确的术语。_Json_Swift_Nsarray_Nsdictionary - Fatal编程技术网

键嵌套数组和/或字典的Swift JSON对象 我是一名学生,希望使用正确的术语。

键嵌套数组和/或字典的Swift JSON对象 我是一名学生,希望使用正确的术语。,json,swift,nsarray,nsdictionary,Json,Swift,Nsarray,Nsdictionary,我需要转到“descriptions”键以填充Label.text。我能得出“结果”,但没有别的 我能够做到这一点,但当我开始使用AVFoundation时,出现了一个下标错误 do { let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) let a1 = json["results"] as? [[String: AnyObject]]

我需要转到“descriptions”键以填充Label.text。我能得出“结果”,但没有别的 我能够做到这一点,但当我开始使用AVFoundation时,出现了一个下标错误

do {
        let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves)

        let a1 = json["results"] as? [[String: AnyObject]]
        let a2 = a1![0]
        let a3 = a2["lexicalEntries"]
        let d1 = a3![0] as? [String: AnyObject]
        let d2 = d1!["entries"] as? [[String: AnyObject]]
        let a4 = d2![0]
        let d3 = a4["senses"] as? [[String: AnyObject]]
        let a5 = d3![0]
        let d4 = a5["definitions"] as? [String]
        let a6 = d4![0]
        dispatch_async(dispatch_get_main_queue(), {
            //self.wordLabel.text = a6 as String
            self.hintLabel.text = a6 as String
        })

        print(a6)

    } catch {
        print("error serializing JSON: \(error)")
        if wordLabel.text != "" && wordLabel.text != nil {
            self.wordLabel.text = "No hints for you!"
        }
    }
[原件-此功能正常,正在按“定义”键][1]

因此,我尝试利用do/try方法编写安全代码,但我只获取“结果”。我在深入到定义时遇到了问题。此快照缺少同步,但我忽略了它

func parseTest(data: NSData) {


    do {
        //let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
        //Not working
        let json: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

        if let results = json["results"] as? [[String: AnyObject]] {
            print(" ResultsBegin \(results) ResultsEnd ")
            /*for result in results*/
            //if let mainDict = (json.objectForKey("results") as? NSArray?)! {
              //  print("mainDict \(mainDict) mainDict")
                if let lexEntry = (json.objectForKey("lexicalEntries") as? NSArray?)! {
                    print("lexEntry \(lexEntry) lexEntry")
                    if let entry = (json.objectForKey("entries") as? NSArray?)!{
                        print("entriesArray \(entry) entriesArray")
                        if let sense = (json.objectForKey("senses") as? NSArray?)! {
                            print("senseArray \(sense) senseArray")
                            if let definition = (json.objectForKey("definitions") as? NSArray?)! {
                                print("defArray \(definition) defArray")
                            }
                        }
                    }

                }


            dispatch_async(dispatch_get_main_queue(), {
                               //self.wordLabel.text = a6 as String
                 self.hintLabel.text = "Made it to Parse Test Function above catch"
                print("Made it to Parse Test Function above catch")
                            })
        }
    } catch {
        print("error serializing JSON: \(error)")
    }
    //print(" Parse Test \(def)")

        }
func parse(data: NSData) {
    print("Made it to Regular Parse Function")
[不拉“定义”键][2]


字典如下

results =     (
            {
        id = angular;
        language = en;
        lexicalEntries =             (
                            {
                entries =                     (
                                            {
                        etymologies =                             (
                            "late Middle English (as an astrological term): from Latin angularis, from angulus angle"
                        );
                        senses =                             (
                                                            {
                                definitions =                                     (
                                    "having angles or sharp corners"
                                );

太深的嵌套是一种著名的错误做法,使用
NSArray
会违反类型安全,而且您仍然会使用许多
在你的“安全代码”中,这是非常不安全的

您的if-let可以这样写:

if
    let a1 = json["results"] as? [[String: AnyObject]] where !a1.isEmpty,
    case let a2 = a1[0],
    let a3 = a2["lexicalEntries"] as? [[String: AnyObject]] where !a3.isEmpty,
    case let d1 = a3[0],
    let d2 = d1["entries"] as? [[String: AnyObject]] where !d2.isEmpty,
    case let a4 = d2[0],
    let d3 = a4["senses"] as? [[String: AnyObject]] where !d3.isEmpty,
    case let a5 = d3[0],
    let d4 = a5["definitions"] as? [String] where !d4.isEmpty,
    case let a6 = d4[0]
{
    //...
    print(a6)
}

在获取带有下标的元素之前,您应该检查数组是否有足够的元素,以及检查订阅字典的非零结果。

嵌套太深是一个著名的错误做法,使用
NSArray
有损类型安全,而且您仍然使用许多
在你的“安全代码”中,这是非常不安全的

您的if-let可以这样写:

if
    let a1 = json["results"] as? [[String: AnyObject]] where !a1.isEmpty,
    case let a2 = a1[0],
    let a3 = a2["lexicalEntries"] as? [[String: AnyObject]] where !a3.isEmpty,
    case let d1 = a3[0],
    let d2 = d1["entries"] as? [[String: AnyObject]] where !d2.isEmpty,
    case let a4 = d2[0],
    let d3 = a4["senses"] as? [[String: AnyObject]] where !d3.isEmpty,
    case let a5 = d3[0],
    let d4 = a5["definitions"] as? [String] where !d4.isEmpty,
    case let a6 = d4[0]
{
    //...
    print(a6)
}
在获取带有下标的元素之前,您应该检查数组是否有足够的元素,并检查订阅字典的非零结果。

func parse(数据:NSData){ 打印(“使其成为常规解析函数”)

do{
让json=try NSJSONSerialization.JSONObjectWithData(数据,选项:.MutableLeaves)
如果让dict=json[“结果”]as?[字典]{
打印(“内部记录”)
如果让lex=dict[0][“词典语法”]as?[Dictionary]{
打印(“内部lex”)
如果let entry=lex[0][“entries”]as?[Dictionary]{
打印(“内部条目”)
如果let sense=条目[0][“senses”]{
印刷品(“内部感觉”)
如果让define=sense[0][“definitions”]as?[String]{
打印(“内部定义”)
让def=define[0]
打印(“这是def”)
打印(def)
//self.hintLabel.text=“\(def)”
dispatch\u async(dispatch\u get\u main\u queue(){
self.hintLabel.text=“\(def)”
})
}
}
}
}
}
}抓住{
打印(“序列化JSON时出错:\(错误)”)
如果hintLabel.text!=''&&hintLabel.text!=nil{
self.hintLabel.text=“对不起,此单词没有提示!”
}
} }
函数解析(数据:NSData){ 打印(“使其成为常规解析函数”)

do{
让json=try NSJSONSerialization.JSONObjectWithData(数据,选项:.MutableLeaves)
如果让dict=json[“结果”]as?[字典]{
打印(“内部记录”)
如果让lex=dict[0][“词典语法”]as?[Dictionary]{
打印(“内部lex”)
如果let entry=lex[0][“entries”]as?[Dictionary]{
打印(“内部条目”)
如果let sense=条目[0][“senses”]{
印刷品(“内部感觉”)
如果让define=sense[0][“definitions”]as?[String]{
打印(“内部定义”)
让def=define[0]
打印(“这是def”)
打印(def)
//self.hintLabel.text=“\(def)”
dispatch\u async(dispatch\u get\u main\u queue(){
self.hintLabel.text=“\(def)”
})
}
}
}
}
}
}抓住{
打印(“序列化JSON时出错:\(错误)”)
如果hintLabel.text!=''&&hintLabel.text!=nil{
self.hintLabel.text=“对不起,此单词没有提示!”
}
} }

感谢您的帮助,希望我的问题不要太混乱。您的“字典如下”不完整,很难重建原始数据。显示JSON的文本表示将帮助读者解决您的问题。(当然结果的数量应该减少…)我感谢你的帮助,希望我的问题不要太混乱。你的“字典如下”不完整,很难重建原始数据。显示JSON的文本表示将帮助读者解决您的问题。(当然结果的数量应该减少…)我现在正在尝试。非常感谢。只是跟进——你为我指出了正确的方向,在我的教练的帮助下,我能够让它运行起来!我正在尝试这个。非常感谢。只是跟进——你为我指出了正确的方向,在我的教练的帮助下,我能够让它运行起来!