Вложенные данные JSON вызовут сбой при использовании словаря NS (в Swift)

#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. По сути, независимо от того, что вы вводите, это не должно привести к сбою 🙂