2015-03-17 19 views
8

tôi đang cố gắng để tạo ra một từ điển từ dữ liệu được tổ chức tại một máy chủ, tôi nhận được dữ liệu nhưng tôi không thể chuyển đổi các dữ liệu vào một NSDictionary, tôi tin rằng nó được tổ chức tại một Object NSDataJSON String để NSDictionary với Swift

let JSONDictionary: Dictionary = NSJSONSerialization.JSONObjectWithData(JSONData!, options: nil, error: &error) as NSDictionary 

Dòng mã này là mã cho tôi vấn đề, nó ném một số BAD_EXEC_INSTRUCTION.

Câu hỏi của tôi: Làm cách nào để tôi có thể biến một số JSON thành NSDictionary?

+2

Bạn có thể đăng một số mã cho biết cách đối tượng NSData của bạn được khai báo và vị trí/cách bạn đang khởi tạo đối tượng đó. – gagarwal

Trả lời

11

Mã của bạn không làm bất cứ xử lý lỗi. Nhưng nó có thể (và nếu dữ liệu này đến từ một dịch vụ web, sẽ) thất bại theo nhiều cách.

  1. Bạn phải đảm bảo rằng dữ liệu của bạn đối tượng thực sự tồn tại
  2. Bạn phải chắc chắn rằng đối tượng dữ liệu có thể được chuyển đổi sang JSON
  3. Bạn phải chắc chắn rằng JSON thực sự chứa một từ điển

Bạn nên sử dụng Swifts cast có điều kiện và đó là khả năng ràng buộc tùy chọn.
Ràng buộc tùy chọn if let JSONData = JSONData kiểm tra xem JSONData không phải là không. Các lực unwrap (JSONData!) bạn sử dụng có thể sụp đổ nếu không có dữ liệu có thể được nhận.

Ràng buộc tùy chọn if let json = NSJSONSerialization.JSONObjectWithData kiểm tra xem dữ liệu có thể được chuyển đổi thành đối tượng JSON hay không. Cast có điều kiện as? NSDictionary kiểm tra xem đối tượng JSON có thực sự là từ điển hay không. Hiện tại, bạn không sử dụng các kiểm tra này, bạn sẽ truyền các đối tượng dưới dạng NSDictionary. Mà sẽ sụp đổ, nếu đối tượng không phải là json hợp lệ, hoặc nếu nó không phải là một từ điển.

Tôi muốn giới thiệu một cái gì đó như thế này:

var error: NSError? 
if let JSONData = JSONData { // Check 1 
    if let json: AnyObject = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) { // Check 2 
     if let jsonDictionary = json as? NSDictionary { // Check 3 
      println("Dictionary received") 
     } 
     else { 
      if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) { 
       println("JSON String: \n\n \(jsonString)") 
      } 
      fatalError("JSON does not contain a dictionary \(json)") 
     } 
    } 
    else { 
     fatalError("Can't parse JSON \(error)") 
    } 
} 
else { 
    fatalError("JSONData is nil") 
} 

Bạn có thể kết hợp kiểm tra 2 và 3 vào một dòng và kiểm tra xem NSJSONSerialization có thể tạo một NSDictionary trực tiếp:

var error: NSError? 
if let JSONData = JSONData { // Check 1. 
    if let JSONDictionary = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) as? NSDictionary { // Check 2. and 3. 
     println("Dictionary received") 
    } 
    else { 

     if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) { 
      println("JSON: \n\n \(jsonString)") 
     } 
     fatalError("Can't parse JSON \(error)") 
    } 
} 
else { 
    fatalError("JSONData is nil") 
} 

Hãy chắc chắn rằng để thay thế fatalError với xử lý lỗi thích hợp trong mã sản xuất của bạn

4

Đây jsonResult sẽ cung cấp cho bạn các phản ứng trong NSDictionary:

let url = NSURL(string: path) 
     let session = NSURLSession.sharedSession() 
     let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in 
      println("Task completed") 
      if(error != nil) { 
       // If there is an error in the web request, print it to the console 
       println(error.localizedDescription) 
      } 
      var err: NSError? 
      var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary 
      if(err != nil) { 
       // If there is an error parsing JSON, print it to the console 
       println("JSON Error \(err!.localizedDescription)") 
      } 

     }) 
     task.resume() 
+0

Nhận xét trong lỗi thứ hai nên đọc: '// Nếu có lỗi phân tích cú pháp JSON, dòng này sẽ không bao giờ đạt được vì mã lỗi xảy ra khi bạn cố gắng mở một giá trị nil ' –

8

Cập nhật cho Swift 2.

Bây giờ bạn phải sử dụng nó bên trong khối thử try.

do { 
     let responseObject = try NSJSONSerialization.JSONObjectWithData(data, options: []) as! [String:AnyObject] 
    } catch let error as NSError { 
print("error: \(error.localizedDescription)") 
} 
+0

@ zaid-pathan Tôi đã hủy chỉnh sửa của bạn bởi vì nó đã giới thiệu một vấn đề. Nếu bạn loại bỏ NSError downcast, bạn không thể gọi phương thức 'localizedDescription' trên' error' nữa. Vui lòng tránh thực hiện các chỉnh sửa thay đổi mã nhiều. Cảm ơn bạn. :) – Moritz

+0

@EricD, Xin lưu ý, cảm ơn bạn. –

Các vấn đề liên quan