从JSON数组创建变量

时间:2015-01-19 08:51:25

标签: ios arrays json swift

我努力学习IOS开发。 我按照this指南成功设法制作了一个有效的问答游戏。最近几天我一直试图将游戏连接到外部数据库。最后,经过几个小时,我可以使用JSON解析从MYSQL中读取数据。

现在我正在努力将json数组转换为普通数组。

我目前的硬编码问题如下:

let questionOne = questionTemplate("the first question?", answerOne: "a answer", answerTwo: "a second answer", answerThree: "a third aswer", answerFour: "tast possible answer", correctAnswer: 2)

然后将它们添加到数组

 spormslaArray = [questionOne, questionTwo, questionThree, questionFour, questionFive, questionSix,questionSeven]

然后在我根据第一个问题到最后一个问题的数组计数器将它们添加到GUI之前,我会做更多的答案和问题加载。

 func questionTemplate(question:String, answerOne:String, answerTwo:String, answerThree:String, answerFour:String, correctAnswer:Int) -> NSArray {

    //Set the question
    var quizQuestion = question

    //set the answers and the right answer

    var firstAnswer = answerOne
    var secondAnswer = answerTwo
    var thirdAnswer = answerThree
    var fourthAnswer = answerFour
    var rightAnswer = correctAnswer



    var gjennverendeSporsmal = 1



    //Add all the questions and answers to an array
    let questionAnswerArray = [question, firstAnswer, secondAnswer, thirdAnswer, fourthAnswer, rightAnswer]
    return questionAnswerArray
}

我现在想将我的数据库中的问题添加到spormslaArray中。我使用以下代码将问题加载到xcode中:

func lasteJson(){

let urlPath = "http://universellutvikling.no/utvikling/json.php"




let url: NSURL = NSURL(string: urlPath)!
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in

    if error != nil {
        // If there is an error in the web request, print it to the console
        println(error.localizedDescription)
    }

    var err: NSError?
    var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
    if err != nil {
        // If there is an error parsing JSON, print it to the console
        println("JSON Error \(err!.localizedDescription)")
    }

    let json = JSON(jsonResult)
    let count: Int? = json["data"].array?.count

    // println("found \(count!) challenges")

//Im just setting a hardcoded number, it will be based on the array when I have figured that out
    var tall = 7
     let ct = count
        for index in 0...tall-1 {

            println(json["data"][index] )

         //DEtte printer ut induviduelt
            /*
            if let questionId = json["data"][index]["id"].string {
              println(questionId)

            }


            if let spm1 = json["data"][index]["answerOne"].string {
                println(spm1)
            }

            if let spm2 = json["data"][index]["answerTwo"].string {
                println(spm2)
            }
            if let spm3 = json["data"][index]["answerThree"].string {
                println(spm3)
            }
            if let spm4 = json["data"][index]["answerFour"].string {
                println(spm4)



            }
            if let correctAnswer = json["data"][index]["correctAnswer"].string {
                println(correctAnswer)
            }

            */

        }
    //}
})
task.resume()

这主要基于此code。 如果我忽略了我在运行应用程序时得到一些断点的事实,并且我的数据库中的北欧字符使得ios模拟器崩溃;这是命令行中的解析结果:

{
  "correctAnswer" : "1",
  "id" : "0",
  "answerThree" : "aa3",
  "answerFour" : "aa4",
  "questionTemplate" : "sporsmal",
  "answerOne" : "as1",
  "answerTwo" : "aa2"
}

//////最后这是问题/////// 我已经尝试了几个小时从json数组生成变量到guestion数组。 我想做这样的事情:

let questionOne = json["data"][index]["answerOne"].string

然后将它们添加到数组

let questionArray[questionOne, QuestionTwo.. etc]

我已经尝试了几个小时没有任何进展,所以我最后的希望是你们! :-)

2 个答案:

答案 0 :(得分:1)

使用此...

发布JSON或接收JSON(将字典保留为GET)

    ///Use completion handler to handle recieved data
func sendJSON(params:Dictionary<String, String>?, toAdressOnServer:String, customCompletionHandler:((parsedData:AnyObject?, statusCode: Int) -> Void)?){
    var request = NSMutableURLRequest(URL: NSURL(string: SERVER_NAME + toAdressOnServer)!)
    var session = NSURLSession.sharedSession()
    var err: NSError?
    if (params == nil){
        request.HTTPMethod = "GET"
    }else{
        request.HTTPMethod = "POST"
        request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params!, options: nil, error: &err)
    }
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        println("Response: \(response)")
        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("Body: \(strData)")
        var err: NSError?
        var json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments , error: &err)
        // Did the JSONObjectWithData constructor return an error? If so, log the error to the console
        if(err != nil) {
            println(err!.localizedDescription)
            let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("Error could not parse JSON: '\(jsonStr)'")
            customCompletionHandler?(parsedData: json, statusCode: -1)
        }
        else {
            // The JSONObjectWithData constructor didn't return an error. But, we should still
            // check and make sure that json has a value using optional binding.
            if let parseJSON: AnyObject = json {
                // Okay, the parsedJSON is here, let's get the value for 'success' out of it
                // Use keyword "success" in JSON from server to register successful transmission
                let success = parseJSON["success"] as? Int
                if (success == nil){
                    customCompletionHandler?(parsedData: json, statusCode: -2)
                }else{
                    customCompletionHandler?(parsedData: json, statusCode: success!)
                }
            }
            else {
                // The json object was nil, something went worng. Maybe the server isn't running?
                let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
                println("Error could not parse JSON: \(jsonStr)")
                customCompletionHandler?(parsedData: json, statusCode: -1)
            }
        }

    })
    task.resume()
}

并且在你的情况下解码JSON数组,但它可以有任何形式。

  self.sendJSON(nil, toAdressOnServer: "ADRESS", customCompletionHandler: { (parsedData, statusCode) -> Void in
        //check for valid data
        if (parsedData != nil){
            //Loop through results
            for (var x = 0; x < parsedData!.count; x++){
                ///primary key of the item from the internet
                let pk:Int = (parsedData![x] as NSDictionary).objectForKey("pk") as Int

                let month = ((parsedData![x] as NSDictionary).objectForKey("fields") as NSDictionary).objectForKey("month")! as String
                let quote = ((parsedData![x] as NSDictionary).objectForKey("fields") as NSDictionary).objectForKey("quote")! as String
                let quotee = ((parsedData![x] as NSDictionary).objectForKey("fields") as NSDictionary).objectForKey("quotee")! as String

    })

这是一个例子,使用解析数据作为&#34; json&#34;并使用适当的结构。在这种情况下,JSON是一些字典的数组,其中包含一个字段字典,其中包含另一个包含更多字段的字典。所以你可以拥有任何JSON结构。

我希望这有帮助!

答案 1 :(得分:0)

似乎你几乎有答案。我认为你缺少的是questionArray.append(...在你的循环中构建你的数组。如果您修改了JSON以使问题在数组而不是离散键中,并且更改questionTemplate以获取数组而不是离散答案,那么您也可以让自己更轻松。

使用你所拥有的东西 -

 func lasteJson(){
        let urlPath = "http://universellutvikling.no/utvikling/json.php"
        let url: NSURL = NSURL(string: urlPath)!
        let session = NSURLSession.sharedSession()

        questionsArray=[Question]()

        let task = session.dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in
            if error != nil {
                // If there is an error in the web request, print it to the console
                println(error.localizedDescription)
            }
            else {
                var err: NSError?
                var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
                if err != nil {
                    // If there is an error parsing JSON, print it to the console
                    println("JSON Error \(err!.localizedDescription)")
                }
                else {
                    let questions=jsonResult["data"] as? [[String:String]]
                    if (questions != nil) {
                        for question in questions! {
                            let answer1=question["answerOne"]!
                            let answer2=question["answerTwo"]!
                            let answer3=question["answerThree"]!
                            let answer4=question["answerFour"]!
                            let id=question["id"]!
                            let questionTemplate=question["questionTemplate"]!
                            let correctAnswer=question["correctAnswer"]!


                            let newQuestion=Question(questionTemplate, answerOne: answer1, answerTwo:answer2, answerThree: answer3, answerFour: answer4, correctAnswer: correctAnswer)

                            questionsArray.append(newQuestion)

                        }
                    }

                }
            }
        })

        task.resume()

    }

你没有显示你的questionTemplate,但我不确定为什么/如何返回数组。我上面的代码假定有一个类Question并填写属性questionsArray