2016-12-29 2 views
1

Я пытаюсь разобрать данные JSON с помощью Swift from Guidebox. Пример данных, как это:Анализ данных JSON в Swift из API-интерфейса API

{ 
    "results": [ 
    { 
     "id": 14673, 
     "title": "The Golden Girls", 
     "alternate_titles": [ 
     "Golden Palace" 
     ], 
     "container_show": 0, 
     "first_aired": "1985-09-14", 
     "imdb_id": "tt0088526", 
     "tvdb": 71292, 
     "themoviedb": 1678, 
     "freebase": "\/m\/01fszq", 
     "wikipedia_id": 217200, 
     "tvrage": { 
     "tvrage_id": 5820, 
     "link": "http:\/\/www.tvrage.com\/shows\/id-5820" 
     }, 
     "artwork_208x117": "http:\/\/static-api.guidebox.com\/120214\/thumbnails_small\/14673-9570342022-208x117-show-thumbnail.jpg", 
     "artwork_304x171": "http:\/\/static-api.guidebox.com\/120214\/thumbnails_medium\/14673-3759246217-304x171-show-thumbnail.jpg", 
     "artwork_448x252": "http:\/\/static-api.guidebox.com\/120214\/thumbnails_large\/14673-2249565586-448x252-show-thumbnail.jpg", 
     "artwork_608x342": "http:\/\/static-api.guidebox.com\/120214\/thumbnails_xlarge\/14673-6064109057-608x342-show-thumbnail.jpg" 
    } 
    ], 
    "total_results": 1, 
    "development_api_key": "You are currently using a temporary development API key. This API key is for testing only. You have used 57 of 250 available calls. Please see the API docs (http:\/\/api.guidebox.com\/apidocs) for additional information or to generate a production API key." 
} 

Кажется, что для моего случая, самый простой способ использования данных будет преобразовать его в [String: Any], как и все, что мне действительно нужно «идентификатор «название» и значение произведения искусства. Однако все (бесчисленные) методы, которые я использовал, терпят неудачу из-за того, что «alternate_titles» анализируется как NSArray, и это делает все более сложным. До сих пор я пытался вариации этого метода:

 do { 
     let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Any] 
     let datafinal = jsonResult["results"] as! [String: Any] 
//Fails around here usually, when the data is converted to [String: Any] or [Any:Any] because of the array. 
     let title = datafinal["title"] 
     } catch { 
      print("JSON Preocessing failed") 
     } 

Я также использовал библиотеку SwiftyJSON, чтобы попытаться преобразовать данные в более легко читаемом формате JSON, но методы, чтобы вытащить словарь из него всегда терпит неудачу (Я полагаю, из-за структуры тоже). У любого есть простой способ получить данные JSON из URL-адреса и легко получить доступ к значениям в «результатах»? Любая помощь высоко ценится!

+0

вы можете поделиться ваши усилия? –

+0

Попробуйте это сделать 'do { let jsonResult = попробуйте JSONSerialization.jsonObject (с помощью: data !, options: JSONSerialization.ReadingOptions.mutableContainers) как! [String: Any] let datafinal = jsonResult ["results"] as! NSArary // Обычно происходит сбой вокруг, когда данные преобразуются в [String: Any] или [Any: Any] из-за массива. название ЛПЭ = datafinal [0] .value (forKey: "название") печать ("\ (название)") } поймать { печать ("JSON Preocessing не удалось") } ' –

+0

создать класс модели и анализировать он использует объект mapper. –

ответ

0

Попробуйте

do { 
    let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Any] 
    let datafinal = jsonResult["results"] as! NSArary 

    let title = datafinal[0].value(forKey: "title") 
    print("\(title)") 
     } catch { 
      print("JSON Preocessing failed") 
     } 
+0

Не могли бы вы добавить описание к вашему решению? – dirtydanee

+0

@dirtydanee мое понимание, он просто хочет получить Title только из одного массива индекса, который является результатом. следующий шаг у него есть словарь внутри массива в 'index 0', и я получаю значение для заголовка ключа' let title = datafinal [0] .value (forKey: "title") '. извините, мой английский не очень хорош, так как ваш ответ тоже хорош. :) –

0

Все, что вам нужно сделать, это получить результаты как array, и взять first elementarray, что такое Dictionary.

В будущем here - отличный инструмент, с помощью которого вы можете лучше проверить структуру своих данных, и это может быстрее выявить проблему.

do { 
    let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Any] 
    guard let results = jsonResult["results"] as? [Any], let resultDictinary = results.first as? [String: Any] else { 
     fatalError("Data structure invalid") 
    } 
    let title = resultDictinary["title"] 
} catch { 
    print("JSON Preocessing failed") 
} 
+0

Я считаю, что это сработает, но в компиляторе возникла некоторая путаница в отношении инструкции охраны и о том, как она была настроена (я думаю, что две кнопки путают ее). Однако, спасибо! Кроме того, мне нравится этот инструмент, моя проблема была в основном в том, как получить к нему доступ. –

+0

Ах, да, это работает! –

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