【问题标题】:Cannot load JSON from php/mysql in Swift无法在 Swift 中从 php/mysql 加载 JSON
【发布时间】:2014-11-22 10:02:05
【问题描述】:

我正在尝试为我的 php/mysql 网站构建一个 IOS 应用程序。问题是我无法让以下代码与我创建的 JSON 输出一起使用。但相同的代码适用于其他 API,例如:

http://www.telize.com/geoip

这是我的代码:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // Playground - noun: a place where people can play

        let urlPath = "https://www.example.com/API_OUT.php?API_KEY=785d...e5f5"
        let url: NSURL = NSURL(string: urlPath)!
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
            println("Task completed")
            if((error) != nil) {
                // If there is an error in the web request, print it to the console
                println(error.localizedDescription)
            }
            var err: NSError?
            var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
            if(err != nil) {
                // If there is an error parsing JSON, print it to the console
                println("JSON Error \(err!.localizedDescription)")
            } else {

                println(jsonResult)

            }

        })
        task.resume()       
    }
}

【问题讨论】:

  • 这看起来不错。您建议它不起作用,但不要准确地告诉我们它的作用。网络请求是否失败? JSON解析是否失败?这究竟是哪里失败了?它会报告什么错误(如果有)?
  • 您好,xcode 控制台没有错误,但是应用程序崩溃并出现 EXC_BREAKPOINT (code=EXC_i386_BPT subcode=0x0)
  • 请提供足够的信息:1)是否打印了“任务完成”? 2)您是否单步执行代码以查看它在哪一行崩溃? (另外,应该是println(jsonResult.description)
  • Yes Task Completed 已打印。它没有显示是哪一行导致了问题,但是当我用 telize.com/geoip 替换 URL 时它工作正常!!!!
  • 你的应用在哪里崩溃????

标签: ios json swift


【解决方案1】:

这个 JSON 是一个数组,而不是一个字典(不像你原来的 JSON,它是一个字典)。因此,您将此新 JSON 分配给字典将失败。

我建议 (a) 使用 NSArray 而不是 NSDictionary; (b) 使用if let ... 语法而不仅仅是let,以便在将来优雅地处理这些错误。

因此,产生:

var parseError: NSError?
if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parseError) as? NSArray {
    println(jsonResult)
} else {
    // If there is an error parsing JSON, print it to the console
    println("JSON Error \(parseError?.localizedDescription)")
}

【讨论】:

  • 顺便说一句,我不建议 .MutableContainers 除非你真的需要可变容器。因此我在上面使用了nil
  • 实际上,使用可变容器是没有问题的,除非你对“封装”很着迷。可变的可能比不可变的要快得多。
  • 同意。但是,除非绝对必须,否则我从不使用 mutable,与其说是出于性能原因,不如说是出于一般代码可维护性的原因(以后引入意外后果的可能性较小,以后更容易分析/调试代码等)。不过,我发表评论的目的并不是要大肆宣传,而是让 OP 知道这个不相关的编辑是一个有意识的决定,而不是我的疏忽。
  • 谢谢我使用了你的代码,现在工作正常。有没有办法让我的 JSON 成为字典?
  • 假设你控制了服务器代码,你可以让你的 JSON 随心所欲。现在它是一个字典数组。通常结构由返回的数据的性质决定。如果总是只返回一个项目,那么字典是有意义的。如果返回可能不止一个项目,那么字典数组是有意义的。如果您想更改您的服务器代码,但不清楚如何做到这一点,那么这肯定是 S.O. 上的一个单独问题
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多