ios - 从 JSON 数组创建变量

标签 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]

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

最佳答案

使用这个...

发布 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

    })

这是一个示例,将解析后的数据用作“json”并以适当的结构使用它。在这种情况下,JSON 是一些字典的数组,其中一个字段字典具有另一个包含更多字段的字典。所以你可以有任何 JSON 结构。

希望对您有所帮助!

关于ios - 从 JSON 数组创建变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28020825/

相关文章:

jquery - 有没有人有将 jqGrid 与 twisted/python 一起使用的示例

jQuery.ajax() 的 Javascript 替代方案 - 面临错误

iphone - 如何在 iOS 中从 PAC 文件获取代理信息

ios - IB Designables : Failed to render and update auto layout status

arrays - 如何将 "merge"两个数组放在一起? (逐项连接字符串)

c# - C# 中的 JSON 到 ListView

ios - 从 dateFromString 到 stringFromDate

ios - 使用多个变量来创建字符串

C-GCC 编译器中的字符数组

c# - HighCharts (highstock) - 数据不会显示