3

辞書にシリアル化する必要があるjsonオブジェクトがあります。NSDictionary にシリアル化できることはわかっていますが、

「Swift 1.2 では、ネイティブの Swift と同等のもの (NSString、NSArray、NSDictionary など) を持つ Objective-C クラスは、自動的にブリッジされなくなりました。」

参照: [ http://www.raywenderlich.com/95181/whats-new-in-swift-1-2]

厄介なブリッジングを避けるために、ネイティブの迅速な辞書に入れています。

NSJSONSerialization メソッドは NSDictionay にのみマップされるため、使用できません。JSON を迅速な辞書にシリアル化する別の方法は何ですか?

4

1 に答える 1

4

で直接 Swift 辞書を使用できますNSJSONSerialization

{"id": 42}:

let str = "{\"id\": 42}"
let data = str.dataUsingEncoding(NSUTF8StringEncoding)

let json = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: nil) as! [String:Int]

println(json["id"]!)  // prints 42

またはAnyObject

let json = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: nil) as! [String:AnyObject]

if let number = json["id"] as? Int {
    println(number)  // prints 42
}

遊び場のスクリーンショット

アップデート:

データが nil の可能性がある場合は、エラーを回避するために安全なアンラップを使用する必要があります。

let str = "{\"id\": 42}"
if let data = str.dataUsingEncoding(NSUTF8StringEncoding) {
    // With value as Int
    if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as? [String:Int] {
        if let id = json["id"] {
            println(id)  // prints 42
        }
    }
    // With value as AnyObject
    if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as? [String:AnyObject] {
        if let number = json["id"] as? Int {
            println(number)  // prints 42
        }
    }
}

Swift 2.0 の更新

do {
    let str = "{\"id\": 42}"
    if let data = str.dataUsingEncoding(NSUTF8StringEncoding) {
        // With value as Int
        if let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:Int] {
            if let id = json["id"] {
                print(id)  // prints 42
            }
        }
        // With value as AnyObject
        if let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:AnyObject] {
            if let number = json["id"] as? Int {
                print(number)  // prints 42
            }
        }
    }
} catch {
    print(error)
}
于 2015-04-19T12:38:55.243 に答える