我无法解析从 NSURL 会话返回的 JSON。我究竟做错了啥?
Posted
技术标签:
【中文标题】我无法解析从 NSURL 会话返回的 JSON。我究竟做错了啥?【英文标题】:I am having trouble parsing JSON that is returned from the NSURL session. What am I doing wrong?我无法解析从 NSURL 会话返回的 JSON。我究竟做错了什么? 【发布时间】:2015-06-11 21:36:28 【问题描述】:我已成功发出 POST 请求并返回数据。当然,在转换之后,我可以以 NSString 的形式打印该语句。
但是,我想将返回的 json 保存在可用的变量/常量中,以便在接下来的后续屏幕中显示。我无法让各种 JSON 解析代码正常工作。
我认为我的一些弱点是不理解“数据”的形式,即在我使用 NSURLSession 时返回。我使用了在其他地方找到的代码,并不太了解返回类型是什么。下面的代码中的数据是 JSON 格式吗? NSData?
无论如何,这个脚本一直有效,直到我开始解析数据,试图弄清楚如何抽象数组。
如果它有助于我的控制台返回我的打印语句(在转换为 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)")
【问题讨论】:
访问 json.org 并学习 JSON 语法。只需大约 10 分钟即可学会。 【参考方案1】:可选的(他们?在代码中)意味着它可以为零。检查Swift Basics
引号消失了,因为它是 NSDictionary 的打印输出,不会以 JSON 格式打印输出。
注意:为了让事情更安全,因为你永远不知道服务器可以返回什么:
if let dataArray = result["result"] as NSArray
//your code
【讨论】:
"result["result"]" 返回字典而不是数组,您可能希望在答案中更新它:)【参考方案2】:字典中有字典:
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)\"")
【讨论】:
我明白了。让我看看它是否有效。另外,我的双字典问题是 NSURL 会话的结果,还是我在某处添加了额外的行导致这种情况发生? @petermaxstack 不,您转换它的方式没有任何问题,这就是数据的来源。让我知道该解决方案如何为您服务! 它似乎不起作用。我不断收到“AnyObject”的行没有一个名为 Generator 的成员:for (key, value) in obj.. 所以本质上我有一个名为 parseJSON 的对象,我应该在 NSDictionary 中使用 JSONserialization.. 。然后我在for循环中写了它并卡住了。 Sorry Json 返回一个包含任何对象的数组,您必须将其转换为字典,我更改为代码来解决这个问题(它可能需要很少的更改,因为我在 Windows 计算机中我是凭记忆做这段代码) 太奇怪了,它一直告诉我我不能将 AnyObject 转换为 NSDictionary,并在该代码处崩溃。另外,当我使用 JSON 序列化时,我觉得格式发生了变化,冒号“:”变成了“=”,如果我想转换为 NSDictionary,这可能是个问题,对吧?我还更新了我在那里的代码!我搞砸了你的代码吗?以上是关于我无法解析从 NSURL 会话返回的 JSON。我究竟做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 swift2 解析 json 并使用 NSJSONReadingOptions 出错
如何从通过 Moya.Response 查询返回的对象解析嵌套的 JSON 数组