1

我正在尝试使用 SwiftyJson 来提取一些 JSON 数据。不寻常的是“println(json)”表示“未知”,而如果我以常规方式提取 JSON 数据,它就可以正常工作——“println(pop)”表示“中等”,正如预期的那样。下面是我正在使用的代码。我开始切割零件,直到我到达“println(json)”,然后决定尝试手动处理它,看看它是 SwiftyJson 还是我。有什么建议么?我对 iOS 编程相当陌生,所以我假设我在某种形式上很傻。

    var ghostlandsJsonUrl: NSURL = NSURL(string: "http://us.battle.net/api/wow/realm/status?realm=Ghostlands")!
    var jsonData: NSData!

    var request: NSURLRequest = NSURLRequest(URL: ghostlandsJsonUrl)
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config)

    let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
        jsonData = data
        if(jsonData != nil) {
            let json = JSON(jsonData)
            println(json)
        } else {
            println("jsonData: nil value... net down again?")
        }

        let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil)
        if let statuses = jsonObject as? NSDictionary{
            if let realms = statuses["realms"] as? NSArray{
                if let realm = realms[0] as? NSDictionary{
                    if let pop = realm["population"] as? NSString{
                        println(pop)
                    }
                }
            }
        }

    });
    task.resume()
4

2 回答 2

2

查看SwiftyJSON 源代码,我可以看到这JSON是一个简单的struct. 它实现了Printable 协议。这给print方法提供了支持。

public var description: String {
        if let string = self.rawString(options:.PrettyPrinted) {
            return string
        } else {
            return "unknown"
        }
    }

这意味着由于某种原因该rawString方法返回nil

public func rawString(encoding: UInt = NSUTF8StringEncoding, options opt: NSJSONWritingOptions = .PrettyPrinted) -> String? {
        switch self.type {
        case .Array, .Dictionary:
            if let data = self.rawData(options: opt) {
                return NSString(data: data, encoding: encoding)
            } else {
                return nil
            }
        case .String:
            return (self.object as String)
        case .Number:
            return (self.object as NSNumber).stringValue
        case .Bool:
            return (self.object as Bool).description
        case .Null:
            return "null"
        default:
            return nil
        }
    }

由于您是 iOS 开发的新手,我会告诉您构造函数不需要NSData对象。

这是来源:

public var object: AnyObject {
    get {
        return _object
    }
    set {
        _object = newValue
        switch newValue {
        case let number as NSNumber:
            if number.isBool {
                _type = .Bool
            } else {
                _type = .Number
            }
        case let string as NSString:
            _type = .String
        case let null as NSNull:
            _type = .Null
        case let array as [AnyObject]:
            _type = .Array
        case let dictionary as [String : AnyObject]:
            _type = .Dictionary
        default:
            _type = .Unknown
            _object = NSNull()
            _error = NSError(domain: ErrorDomain, code: ErrorUnsupportedType, userInfo: [NSLocalizedDescriptionKey: "It is a unsupported type"])
        }
    }
}

因此,您应该将其传递为未序列化NSData的:

if let jsonData = data {
    //jsonData can't be nil with this kind of if

    let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil)
    let json = JSON(jsonObject)
    println(json)
    //...
于 2015-04-09T09:07:34.083 回答
2

JSON 的构造函数进行序列化。下面是来自 SwiftyJSON git repo 的构造函数代码,您可以在其中直接传递 NSData。

    public init(data:NSData, options opt: NSJSONReadingOptions = .AllowFragments, error: NSErrorPointer = nil) {
    do {
        let object: AnyObject = try NSJSONSerialization.JSONObjectWithData(data, options: opt)
        self.init(object)
    } catch let aError as NSError {
        if error != nil {
            error.memory = aError
        }
        self.init(NSNull())
    }
}

简单来说,您可以在代码中直接使用 NSURLSession 数据任务的完成处理程序中返回的数据,如下所示。

let json = JSON(data: jsonData)
于 2016-08-05T02:15:43.817 回答