我正在成功发出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)")
}
}
答案 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
}