2016-04-05 4 views
1

Я новичок в Swift и JSON, и у меня проблемы. Я посмотрел на все виды Q & A здесь и попытался включить совет, но я не могу сделать это правильно.Быстрая ошибка сериализации JSON

У меня есть сервер, создающий JSON, который в порядке в соответствии с проверкой JSON lint checker (http://jsonlint.com).

Использование браузера, реакция заключается в следующем:

[{ "PostalCode": "NW4 2JL"}, { "PostalCode": "NW4 2ES"}, { "PostalCode": "NW4 3XP"} , {«PostalCode»: «NW4 4DU»}, {«Почтовый код»: «NW4 2HH»}, {«Почтовый код»: «NW4 2DR»}, {«Почтовый код»: «NW4 2DX»}]

Xcode , однако, дает мне эту ошибку:

Ошибка, извините, не удалось разобрать JSON: Необязательно ([{"PostalCode": "NW4 2JL"}, {"PostalCode": "NW4 2ES"}, {"PostalCode" : «NW4 3XP»}, {«PostalCode»: «NW4 4DU»}, {«Почтовый код»: «NW4 2HH»}, {«Почтовый код»: «NW4 2DR»}, {«Почтовый код»: «NW4 2DX»} ])

Что меня озадачивает, и я не могу найти объяснения, это часть «Необязательный()». До этого оператор ошибки, как я написал, в строке 12 (единственное сообщение, которое включает слово «извините»). JSON внутри «()» выглядит отлично.

Может ли кто-нибудь сообщить, что я сделал не так, или, по крайней мере, откуда появился текст «Необязательный()»?

Это соответствующая часть моего кода:

let task = session.dataTaskWithRequest(request) { data, response, error in 
     guard data != nil else { 
      print("no data found: \(error)") 
      return 
     } 
     do { 
      if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? NSDictionary { 
       let success = json["success"] as? Int 
       print("Success: \(success)") 
      } else { 
       let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
       print("Error, sorry, could not parse JSON: \(jsonStr)") 
      } 
     } catch let parseError { 
      print(parseError) 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Error could not parse JSON: '\(jsonStr)'") 
     } 
    } 
+0

@ Эрик D: опции могут быть преходящими тоже, я полагаю, что они есть для соображений обратной совместимости, а не потому, что они умны. –

+0

@IanBell Опционы - ключевая концепция в Swift, сказал Крис Латттнер много раз. Скоро они не пойдут. :) – Moritz

+0

Ничего себе, этот сайт хорош. Как только я разместил это, я нашел ответ в другом месте (http://stackoverflow.com/questions/8356842/how-to-use-nsjsonserialization). Мне очень жаль. Решение заключалось в том, чтобы использовать NSArray вместо NSDictionary, так как ответ был массивом. – Denis

ответ

0

С этой линией:

let success = json["success"] as? Int 

вы делаете successДополнительный. А поскольку опции соответствуют протоколу CustomStringConvertible, вы получаете «Необязательный (...)» как строку.

Если вы еще не знаете, что является дополнительным, остановите все и узнайте об этом. Теперь. ;)

Готово? Хорошо, теперь безопасно разворачиваем опционально с, например, опциональным связыванием:

if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary { 
    if let success = json["success"] as? Int { 
     print("Success: \(success)") 
    } 
} 

Вот и все.

Обратите внимание, что здесь мы доступ к словарь, но в вашем вопросе о JSON является массив словарей: это немного неясно, что вы на самом деле.

Смежные вопросы