我无法解析从 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 数组

带有来自 WebService 的会话 ID 的 IOS 登录 JSON 解析器

从 json 会话返回值以在会话外使用

从 url iOS 解析 json 时应用程序崩溃

无法解析 JSON 数据以与 rxjs 交互