web-dev-qa-db-ja.com

JSONシリアル化がswift

次のコード行を使用してObjective-CでJSONデータを解析していましたが、Swift)でも同じようにアプリがクラッシュします。

_NSDictionary* json = [NSJSONSerialization
                          JSONObjectWithData:_webData
                          options:kNilOptions
                          error:&error];
_

_NSJSONReadingOptions.MutableContainers_を使用してみましたが、機能しないようです。オンラインで見つかったさまざまなJSON妥当性チェッカーを使用して、Webサーバーから取得したJSONデータの妥当性を検証しました。

[編集]私が使用しているSwiftコードは次のとおりです。

_let jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers , error: &error) as NSDictionary
_

[更新]

let jsonResult: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionaryを使用すると、問題が解決します。

12
Jeswin

Xcodeが表示するエラーはあまり役に立ちませんが、error変数を別の方法で宣言する必要があるようです( Appleのドキュメントで詳しく説明します )。辞書が戻ってくるケースを処理するnil

var error: AutoreleasingUnsafePointer<NSError?> = nil
let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data,
        options:NSJSONReadingOptions.MutableContainers,
        error: error) as? NSDictionary
if jsonResult {
    // process jsonResult
} else {
    // couldn't load JSON, look at error
}
3
Nate Cook

すべての答えが私にはうまくいきませんでした。これは機能しました(21.01.2015-Xcode 6.1.1/iOS 8.1.2):

 var err: AutoreleasingUnsafeMutablePointer<NSError?> = nil

 var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error:err) as NSDictionary

ここでそれを見つけました: 宣言されていないタイプAutoreleasingUnsafePointer Xcode 6ベータ6の使用

3
MB_iOSDeveloper

ゼロは動作する必要があります、私はあなたのエラーが別の問題から来ていると思います、より多くのコード/クラッシュログを投稿してください

    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options:    NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

やってみませんか?

1
jaumard
// Created a NSDictionary to hold the data
var tempLocations : NSArray = NSArray()
var modelLocation : [Location] = [] // Will hold all the locations read in from datafile
// setup the path for the data
let jsonData = NSData(contentsOfURL: fullPathForDataFile)

if let realJsonData = jsonData { // doing a test to check that the data exists
    tempLocations = NSJSONSerialization.JSONObjectWithData(realJsonData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSArray
    println("imported location data file with \(error) errors")
} else {
    // The data file does not exist, tell the user!
}

// For each set of object data in the json file do a loop.
for room in 1..<tempLocations.count {
    var newlocation : Location // This object contains var code:String?
    newlocation.code = tempLocations[room].valueForKey("code") as String
    // save the new location somewhere.
    modelLocation.addObject(newLocation)
}
0
iCyberPaul