#ios #json #xcode #nsdictionary #swift
#iOS #json #xcode #nsdictionary #swift
Вопрос:
Я пытаюсь получить информацию о фильме в формате JSON, используя JSONSerialization в Swift, и сохранить ее как NSDictionary. Однако вызов API Rotten Tomatoes (в котором вложена информация) приведет к сбою моей игровой площадки (без каких-либо полезных ошибок).).
Я знаю, что код несколько корректен, поскольку вызов других API, которые не вкладывают свои данные, работает (но не удовлетворяет моим потребностям).
Вот код:
func getJSON(urlToRequest: String) -> NSDictionary {
var url = NSURL(string: urlToRequest)
var error: NSError?
let jsonData: NSData = NSData.dataWithContentsOfURL(url , options: NSDataReadingOptions.DataReadingMapped, error: nil)
let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: amp;error) as NSDictionary
return jsonDict
}
let movieData: NSDictionary = getJSON(apiURL)
вот пример из API Rotten Tomatoes JSON (сокращенный для иллюстрации, это фактический файл JSON, а не вывод из моего кода)
{
"id": 770672122,
"title": "Toy Story 3",
"year": 2010,
"genres": ["Animation", "Kids amp; Family", "Science Fiction amp; Fantasy", "Comedy"],
"release_dates": {
"theater": "2010-06-18",
"dvd": "2010-11-02"
},
"ratings": {
"critics_rating": "Certified Fresh",
"critics_score": 99,
"audience_rating": "Upright",
"audience_score": 89
}
}
Комментарии:
1. Возможно ли это обернуто в массив
[]
? Пожалуйста, укажите рабочий URL для «Гнилых помидоров».2. @Zaph Я не могу дать вам URL-адрес, поскольку он содержит мой уникальный ключ API, но если вы перейдете сюда, вы увидите примеры выходных данных из разных типов запросов developer.rottentomatoes.com/docs — то, как вы видите их там, в точности соответствует тому, как они отображаются, когда я их запрашиваю (по крайней мере, в соответствии с моим браузером, посколькуЯ не могу сделать это в Xcode)
3. Является ли код, который вы опубликовали
NSLog()
из своего приложения, копией / вставкой с сайта Rotten Tomatoes?4. @Zaph Скопировано с сайта — как только я пытаюсь ввести URL-адрес rotten tomatoes в приведенном выше коде, происходит сбой, поэтому не удается получить журнал. Обратите внимание, что ввод URL-адреса в моем браузере возвращает то же самое (за вычетом форматирования), что и на веб-сайте RT
Ответ №1:
Этот код работает для меня в приложении Swift для iOS (сбой Xcode при запуске на игровой площадке:
func getJSON(urlToRequest: String) -> NSDictionary {
var url = NSURL(string: urlToRequest)
var error: NSError?
let jsonData: NSData = NSData.dataWithContentsOfURL(url , options: NSDataReadingOptions.DataReadingMapped, error: nil)
let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: amp;error) as NSDictionary
return jsonDict
}
let apiURL = "http://api.rottentomatoes.com/api/public/v1.0/movies/770672122.json?apikey=9p4xwzpgt8xp2vahnyx2sc6g"
let movieData: NSDictionary = getJSON(apiURL)
println(movieData)
Похоже, что сбой, который вы получаете, является ошибкой игровой площадки.
Обратите внимание, что Swift в основном гарантированно содержит ошибки, это ранняя бета-версия.
Также явно укажите, что JSON является примером кода, а не для запуска вашего кода.
Комментарии:
1. Я создал временный ключ API, чтобы вы могли его увидеть — вот пример URL, который работает api.rottentomatoes.com/api/public/v1.0/movies/… Я попытался запустить Charles, и он сообщил об успешном доступе, поэтому я думаю, что с сервером все в порядке — дайте мне знать, в чем, по вашему мнению, может быть проблема. Большое спасибо за вашу помощь.
2. Глядя на мою игровую площадку, кажется, что части fetch и jsonData выполняются нормально, и происходит сбой при попытке обработать часть jsonDict — поэтому я думаю, что это ошибка JSON
3. большое спасибо! Думаю, мне пока не следует слишком доверять игровой площадке, и я отредактирую вопрос, чтобы он был более четким
4. Прямо сейчас у игровой площадки, похоже, есть несколько проблем с отображением вложенных NSDictionary и NSArray. По сути, независимо от того, что вы вводите, это не должно привести к сбою 🙂