【问题标题】:Swift JSON serialisation errorSwift JSON 序列化错误
【发布时间】:2016-04-05 14:25:13
【问题描述】:

我是 Swift 和 JSON 的新手,遇到了麻烦。我在这里查看了各种问答,并尝试将建议纳入其中,但未能正确执行。

我有服务器生成 JSON,根据 JSON lint 检查器 (http://jsonlint.com) 可以。

使用浏览器,响应是这样的:

[{"PostalCode":"NW4 2JL"},{"PostalCode":"NW4 2ES"},{"PostalCode":"NW4 3XP"},{"PostalCode":"NW4 4DU"},{" PostalCode":"NW4 2HH"},{"PostalCode":"NW4 2DR"},{"PostalCode":"NW4 2DX"}]

但是,Xcode 给了我这个错误:

错误,抱歉,无法解析 JSON:Optional([{"PostalCode":"NW4 2JL"},{"PostalCode":"NW4 2ES"},{"PostalCode":"NW4 3XP"},{" PostalCode":"NW4 4DU"},{"PostalCode":"NW4 2HH"},{"PostalCode":"NW4 2DR"},{"PostalCode":"NW4 2DX"}])

让我感到困惑且无法解释的是“Optional()”部分。在此之前,错误声明是我在第 12 行写的(唯一包含“对不起”一词的消息)。 '()' 中的 JSON 看起来不错。

谁能告诉我在这里做错了什么,或者至少'Optional()'文本来自哪里?

这是我的代码的相关部分:

   let task = session.dataTaskWithRequest(request) { data, response, error in
        guard data != nil else {
            print("no data found: \(error)")
            return
        }
        do {
            if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? NSDictionary {
                let success = json["success"] as? Int
                print("Success: \(success)")
            } else {
                let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
                print("Error, sorry, could not parse JSON: \(jsonStr)")
            }
        } catch let parseError {
            print(parseError)
            let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print("Error could not parse JSON: '\(jsonStr)'")
        }
    }

【问题讨论】:

  • @Eric D:可选选项也可能是暂时的,我想它们是出于向后兼容的原因,而不是因为它们很聪明
  • @IanBell Optionals 是 Swift 中的一个关键概念,Chris Lattner 已经说过很多次了。他们不会很快去任何地方。 :)
  • 哇这个网站不错。我一发布这个,我就在别处找到了答案(stackoverflow.com/questions/8356842/…)。真对不起。解决方案是使用 NSArray 而不是 NSDictionary,因为响应是一个数组。
  • 谢谢,我会这样做的。
  • @Eric D:我必须承认我真的不喜欢他们,所以我投票支持他们尽快消失 :-)

标签: php json swift


【解决方案1】:

用这一行:

let success = json["success"] as? Int

您将success 设为可选。而且由于可选项符合CustomStringConvertible 协议,您会得到“Optional(...)”作为字符串

如果您还不知道什么是 Optional,请停止一切并了解它。现在。 ;)

完成了吗?好的,现在安全地解开可选的包装,例如可选绑定:

if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary {
    if let success = json["success"] as? Int {
        print("Success: \(success)")
    }
}

就是这样。

请注意,我们在这里访问的是 dictionary,但在您的问题中,JSON 是一个 array 的字典:有点不清楚您实际拥有什么。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2015-02-07
    • 2018-07-28
    • 2018-11-26
    相关资源
    最近更新 更多