Swifty Json变得陌生,但很长的路可以正常工作?

时间:2015-04-09 08:50:20

标签: json swift ios8 swifty-json

我试图使用SwiftyJson来提取一些JSON数据。 " println(json)"" println(json)"说" unknowon"如果我以常规的方式提取JSON数据它就可以正常工作 - " println(pop)"正如预期的那样说中等。 以下是我正在使用的代码。我开始切割零件,直到我得到#print; 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()

2 个答案:

答案 0 :(得分:2)

查看SwiftyJSON source code我可以看到JSON是一个简单的struct。它实现了Printable protocol。它支持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)
    //...

答案 1 :(得分: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)