Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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

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
正确解析swift 3中的json(数组与对象)_Json_Swift_Multidimensional Array - Fatal编程技术网

正确解析swift 3中的json(数组与对象)

正确解析swift 3中的json(数组与对象),json,swift,multidimensional-array,Json,Swift,Multidimensional Array,别紧张,我对斯威夫特还是个新手。我从一个API中提取数据,该API返回垒球联盟的比赛信息。下面是JSON数据的示例: { "577": { "Away": "PUPPY MONKEY BABY", "Date": "March 20, 2017", "Day": "Monday", "GameID": "577", "Home": "JUSTIN SANE", "Score": "1-

别紧张,我对斯威夫特还是个新手。我从一个API中提取数据,该API返回垒球联盟的比赛信息。下面是JSON数据的示例:

    {
    "577": {
        "Away": "PUPPY MONKEY BABY",
        "Date": "March 20, 2017",
        "Day": "Monday",
        "GameID": "577",
        "Home": "JUSTIN SANE",
        "Score": "1-14",
        "Status": "Final",
        "Time": "7:00 PM"
    },
    "578": {
        "Away": "LAST CALL",
        "Date": "March 20, 2017",
        "Day": "Monday",
        "GameID": "578",
        "Home": "T-TOWN",
        "Score": "12-11",
        "Status": "Final",
        "Time": "6:00 PM"
    },
    "579": {
        "Away": "SHOCKERS",
        "Date": "March 20, 2017",
        "Day": "Monday",
        "GameID": "579",
        "Home": "TBD",
        "Score": "19-9",
        "Status": "Final",
        "Time": "8:00 PM"
    }
}
我试图打印每场比赛的主队作为开始(这样我就知道我正确地解析了数据)。下面是我的代码

let url = URL(string: "http://www.SOMEURL.org/REST/list_games")

let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
    if error != nil {
        print("ERROR")
    } else {
        if let content = data {
            do
            {
                let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
                //print(myJson)
                for game in myJson as! [AnyObject] {
                    print(game["Home"]!!)
                }

            } catch {
            }
        }
    }
}
task.resume()

请帮帮我。有一点描述性帮助我理解我做错了什么,这给了我额外的分数。我认为我将数组强制转换为错误的类型?

您的顶级对象是一个字典,而不是一个数组(这似乎是您的代码所假定的)-以下是一些适用于您的代码:

关于此代码,需要注意以下几点:

a) 我已更新以删除
的使用,它强制展开值,通常不适合在具有生产价值的代码中进行json解析,因为它会导致崩溃
guard let
在这里是一个不错的选择(虽然冗长)

b) 这与您的代码之间的主要区别在于,它逐步帮助编译器理解(通过强制转换)应该从JSON中获得什么值类型

c) 上面的内容可以整理得不那么冗长,但希望能很好地作为一个例子


总的来说,我建议你看一下Ray Wenderlich教程,了解更多的理论。祝你好运

很好,另外,您可以在
LeagueResult
类中创建一个初始值设定器,该初始值设定器接受字典作为参数,以便所有解析逻辑都可以进入其中。非常感谢您的帮助!这让我更亲近了。我注意到它只打印了几个球队的名字,而不是整个名单。我对你的代码做了一次修改。它应该是打印的(值[“主页”]??“未知”)而不是打印的(项目[“主页”]??“未知”),经过更多的调查,警卫声明发现数据中存在一些问题,返回的是问题。很酷-很高兴它有帮助!快乐编码。
guard let url = URL(string: "http://www.SOMEURL.org/REST/list_games") else { return }

let task = URLSession.shared.dataTask(with: url) { data, response, error in

    if error != nil {
        print("ERROR")
        return
    }

    do {
        // Ensure there is data returned from the HTTP request
        guard let data = data else { return }

        // Obtain all of the JSON - where the key is something like "578" (a String); and
        // the value is the dictionary of values (here given the type of 'AnyObject')
        guard let myJSON = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: AnyObject] else { return }

        // Iterate through the keys of the dictionary, retrieving the associated 'values' 
        // dictionary, and printing the value of 'Home'. 

        // If the 'Home' key does not have an associated value for some reason, 
        // print 'Unknown' instead.
        for key in myJSON.keys {
            guard let values = myJSON[key] as? [String : String] else { return }
            print(values["Home"] ?? "Unknown")
        }

    }
    catch {
        print("An error occurred parsing the JSON")
    }
}
task.resume()