在 Swift 中访问 JSON 对象时出错

Posted

技术标签:

【中文标题】在 Swift 中访问 JSON 对象时出错【英文标题】:Error accessing JSON object in Swift 【发布时间】:2014-06-11 16:58:27 【问题描述】:

我有这个 Swift 代码:

func getData(completion: (array: Array<AnyObject>)->Void) 
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let session: NSURLSession = NSURLSession(configuration: sessionConfiguration)
    var request: NSURLRequest = NSURLRequest(URL: NSURL(string: "http://coinabul.com/api.php"))

    let task: NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: (data, response, error) in
        if !error 
            let httpResp: NSHTTPURLResponse = response as NSHTTPURLResponse
            if httpResp.statusCode == 200 
                var json: NSDictionary = self.convertDataToJSON(data)
                var myArray: Array = Array<Currency>()

                for (key: AnyObject, object: AnyObject) in json 
                    let info: NSDictionary = object as NSDictionary

                    let grams: CGFloat = info["Grams"] as CGFloat
                    let ounces: CGFloat = info["Ounces"] as CGFloat
                    let usd: CGFloat = info["USD"] as CGFloat

                    // Do something with those values
                
            
        
        )

    task.resume()


func convertDataToJSON(data: NSData) -> NSDictionary 
    var error: NSError?
    var jsonDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &error) as NSDictionary

    return jsonDictionary

“json”NSDictionary 是正确的。如果我打印它:


    BTC =     
        Grams = "15.398340412292";
        Ounces = "0.49506814017307";
        SilverGrams = "1010.0959168583";
        SilverOunces = "32.475337832916";
        USD = "624.825500000000";
    ;
    Gold =     
        Grams = "0.06494206341493";
        Ounces = "2.0199239627704";
        USD = "1262.100000000000";
    ;
    Silver =     
        Grams = "0.0009900049917623401";
        Ounces = "0.030792597293164";
        USD = "19.240000000000";
    ;

我可以做json["Silver"],得到对应的对象。但是,如果我尝试执行 json["Silver"]["USD"],我的应用程序就会崩溃。

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

表达式:

json["Silver"]

返回 AnyObject? 不允许 [] 因为它是未知的,因此您必须对其进行类型转换以供进一步参考。请注意,如果您尝试在工作区中执行此操作,Xcode 当前会崩溃

json["Silver"] as? Dictionary

您可以使用可选链接将它们串在一起,如下所示:

(json["Silver"] as? NSDictionary)?["USD"]

请注意,索引操作的结果几乎总是可选的,而可选链接意味着这个肯定是可选的,因此您必须处理检查和展开。

【讨论】:

以上是关于在 Swift 中访问 JSON 对象时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 4 中使用可编码的 JSON 时出错?

在swift ios中解析NSJSON序列化中的json时出错

Swift4:从文件中解码 json 时出错

将 json 和 HTTP“post”代码转换为 Swift 3 时出错

使用 Swift 2 合并 JSON 数据时出错

我在 Swift 5 上解码 json 时出错