我在解析从NSURL会话返回的JSON时遇到问题。我究竟做错了什么?

时间:2015-06-11 21:36:28

标签: ios json swift nsurlsession nsjsonserialization

我正在成功发出POST请求并返回数据。然后我可以在转换后以NSString的形式打印该语句。

但是,我想将返回的json保存在可用的变量/常量中,以便我可以在下一个后续屏幕中显示。我无法使用各种JSON解析代码。

我认为我的一些弱点是不理解'数据'的形式,当我使用NSURLSession时会返回。我使用了我在其他地方找到的代码,并且不太了解返回类型是什么。这些数据来自JSON中的以下代码吗? NSData的?

无论如何,这个脚本一直有效,直到我开始解析数据,试图弄清楚如何抽象数组。

如果它有助于我的控制台返回我的print语句(转换为NSString之后):

Optional({
  "result":   {
  "girl": "monica",
  "waist": 22.0,
  "hair": "Brunette",
  "location": "Los Angeles"
  }
})

当我尝试使用NSJSON序列化框架时,该对象的输出看起来像这样,它应该是一个NSDictionary?:

{
result:   {
  girl: monica;
  waist: 22.0;
  hair: Brunette;
  location: "Los Angeles";
  }
}

有些事让我困惑。为什么引号会消失,什么是可选的和额外的“结果”属性...这是我的代码从NSURL请求开始到代码结束

    let request = NSMutableURLRequest(URL: NSURL(string: "http://localhost:5000")!)
    request.HTTPMethod = "POST"
    let postString = "color=\(finalDataPassed)&type=\(thirdDataPassed)&hair=\(dataPassed)&location=\(secondDataPassed)"

    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            println("error=\(error)")
            return
        }

        println("response = \(response)")

        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)

        println(responseString)
        var error: NSError?

        let result = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error)
            as? NSDictionary

        if(error != nil) {
            println(error!.localizedDescription)
            let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("Error could not parse JSON: '\(jsonStr)'")
        }
        else {
            if let parseJSON = result {

                println(parseJSON)
                for item in parseJSON { // loop through data items
                    let obj = (item as! NSDictionary).objectForKey("result") as! NSDictionary
                    for (key, value) in obj {
                        println("Property: \"\(key as! String)\"")
                    }
                }

            }
            else {

                let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
                println("Error could not parse JSON: \(jsonStr)")

            }
        }

2 个答案:

答案 0 :(得分:0)

你在字典里面有一本字典:

{
result: <- Key first dictionary    
  {
  girl: monica; <- start of second dictionary
  waist: 22.0;
  hair: Brunette;
  location: "Los Angeles"; <- end of second dictionary
  }
}

对于通用方法,您可以使用:

   for item in dataArray { // loop through data items
        let obj = item.first as! NSDictionary
        for (key, value) in obj {
            println("Property: \"\(key as! String)\"")
            for (key2, value2) in (value as NSDictionary){
                println("Property: \"\(key2 as! String2)\"")
            }
        }
    }

在你的情况下,因为第一个字典只是一个键,你可以直接检索它而不是使用第一个for循环:

for item in dataArray { // loop through data items
    let obj = (item.first as! NSDictionary).objectForKey("result") as NSDictionary
    for (key, value) in obj {
        println("Property: \"\(key as! String)\"")
    }
}

答案 1 :(得分:0)

可选(他们在代码中?)意味着它可以是零。查看Swift Basics

引号消失了,因为它是NSDictionary的打印输出,不能以JSON格式打印出来。

注意:为了让事情变得更安全,因为您永远不知道哪个服务器可以返回:

if let dataArray = result["result"] as NSArray{
      //your code
}