从 Guidebox API 在 Swift 中解析 JSON 数据

Posted

技术标签:

【中文标题】从 Guidebox API 在 Swift 中解析 JSON 数据【英文标题】:Parsing JSON Data in Swift from Guidebox API 【发布时间】:2016-12-29 09:26:10 【问题描述】:

我正在尝试使用 Guidebox 中的 Swift 解析 JSON 数据。数据示例如下:

 
  "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],因为我真正需要的只是“id”、“title”和艺术品值。但是,我使用的所有(无数)方法都失败了,因为“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 数据并轻松访问“结果”中的值?非常感谢任何帮助!

【问题讨论】:

你能分享你的努力吗? 试试这个do let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Any] let datafinal = jsonResult["results"] as! NSArary //Fails around here usually, when the data is converted to [String: Any] or [Any:Any] because of the array. let title = datafinal[0].value(forKey: "title") print("\(title)") catch print("JSON Preocessing failed") 创建一个模型类并使用对象映射器解析它。 我已经创建了我的答案,请注意。如果有任何问题,请告诉我,谢谢! 【参考方案1】:

试试这个

 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")
      

【讨论】:

能否在您的解决方案中附加说明? @dirtydanee 我的理解,他只想从一个索引数组中获取标题,即结果。下一步他在index 0 的数组中有一个字典,我正在获取键标题let title = datafinal[0].value(forKey: "title") 的值。对不起,我的英语不是很好,顺便说一句,你的回答也很好。 :)【参考方案2】:

您需要做的就是以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")

【讨论】:

我相信这会奏效,但是编译器对保护语句及其设置方式存在一些混淆(我认为这两个让我们混淆了它)。不过还是谢谢!另外,我喜欢那个工具,我的问题主要是如何访问它。

以上是关于从 Guidebox API 在 Swift 中解析 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

我无法从 plist 键值中解包值

为啥我在我的 Swift 文件中解包 nil?

ValueError:没有足够的值来解包(预期为 2,得到 1)当试图在 python 中解包 dict 以使用 pandas 进行数据标记时

如何在单个路由中解组 POST 参数和 JSON 正文?

使用 ZipFile 类从多个文件的 zip 存档中解压缩文件

如何从字节数组元素中解包/提取低阶和高阶值