2016-12-29 60 views
1

我试图解析使用雨燕从Guidebox JSON数据。该数据的一个例子是这样的:斯威夫特解析JSON数据从Guidebox 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." 
} 

看来,我的情况,使用数据的最简单的方法是将其转换为[字符串:任何],因为我真正需要的是“ID “,”标题“和艺术品价值。然而,我所使用的所有(无数)方法都失败了,因为“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转换,但拉字典的方法,由它总是失败(我猜也是由于结构)。任何人都有一个简单的方法从URL中获取JSON数据并轻松访问“结果”中的值?任何帮助深表感谢!

+0

你可以分享你的努力? –

+0

试试这个'千万{ 让jsonResult =尝试JSONSerialization.jsonObject(附:数据!选择:JSONSerialization.ReadingOptions.mutableContainers)为! [String:Any] let datafinal = jsonResult [“results”] as! NSArary //当数据由于数组转换为[String:Any]或[Any:Any]时,通常会在这里失效。 令标题= datafinal [0]。价值(forKey: “标题”) 打印( “\(标题)”) }赶上{ 打印( “JSON Preocessing失败”) }' –

+0

创建模型类和解析它使用对象映射器。 –

回答

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进行访问,并将arrayfirst element取为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

啊,是的,这是有效的! –