解析嵌套的JSON与Alamofire 4

问题描述:

所以我一直在试图整天使用Alomofire 4我的WordPress REST API解析JSON,我已经试过所有我能找到的是/是与我的问题但我仍然不能管理解决我的问题。解析嵌套的JSON与Alamofire 4

我们的目标仅仅是从API执行请求并将其打印出来,从那里我可以管理,但由于JSON似乎有嵌套的数组/字典,我很难搞清楚要使用什么。

我的代码:

Alamofire.request(_newsURL).responseJSON { response in 
     print(response.result) 

     if let json = response.result.value as? [Any] { 

      print("JSON: \(json)") 
     } 

     if let dict = response.result.value as? Dictionary<String, AnyObject>{ 

      print(response.result.value) 

      if let slug = dict["slug"] as? String { 

       self._newsSlug = slug 
      } 

      print("Hello News") 
      print(self._newsURL) 
      print(self._newsSlug) 
     } else { 
      print("Found Nothing") 
     } 
    } 

的API:http://www.wsvh.nl/wp-json/wp/v2/posts

我的目标是简单地调用,并打印出的东西,如标题(这是BTW还嵌套更?)。我试图让它与slug一起工作,因为我不像所呈现的标题那样嵌套,所以我想我应该从最简单的部分开始,但我甚至无法设法让它工作。

在此先感谢。

该API返回一个阵列字典,其中每个字典表示[String: Any]类型的邮政

Alamofire.request(_newsURL).responseJSON { response in 
    if let posts = response.result.value as? [[String: Any]] { 
    posts.forEach { post in 
     if let slug = post["slug"] as? String { 
     print("Slug: \(slug)") 
     } 
     if let title = post["title"] as? [String: String] { 
     print("Title: \(title["rendered"])") 
     } 
     if let categories = post["categories"] as? [Int] { 
     print("Categories: \(categories)") 
     } 
     // You can retrieve as many field as you like as above... 
    } 
    } 
} 

我强烈建议你利用的对象映射库的诸如ObjectMapper所以你不必担心类型检查或铸造。

只需创建一个名为Post模型:

import ObjectMapper 

class Post: Mappable, CustomStringConvertible { 

    var title: String? 
    var slug: String? 

    var link: URL? 
    var content: String? 

    required init?(map: Map) {} 

    func mapping(map: Map) { 
    title <- map["title.rendered"] 
    slug <- map["slug"] 

    link <- (map["link"], URLTransform()) 
    content <- map["content.rendered"] 
    } 

    var description: String { 
    return "Post <\(title ?? "No title")>" 
    } 
} 

,所以你可以检索的所有帖子如下:

import AlamofireObjectMapper 

Alamofire.request("http://www.wsvh.nl/wp-json/wp/v2/posts") 
    .responseArray { (response: DataResponse<[Post]>) in 

    // This will give you the array of Post objects. 
    print("Posts: \(response.result.value)") 
} 

我为您创建了一个example project。您可以下载并使用它来更好地了解如何执行映射。

+0

最后,打印出的请求!但是,我的最终目标是将其制作为tableview,因此我需要使Title成为一个var,以便我可以使用它来操作文本。但试图使标题变成一个变种给我和错误,因为它不是一个字符串。 – Flowne

+0

神圣莫里!非常感谢你:D这完全解决了我所有的问题,为你节省了我最大的头痛。 – Flowne

对于这种类型的任务,我建议你使用SwiftyJSON。它会帮助你保持简单和干净的事情。 例如

Alamofire.request(_newsURL).responseJSON(completionHandler: { 
     response in 
     if let value = response.result.value { 
      let json = JSON(value) //Don't forget to import SwiftyJSON 
      debugPrint(json) 
      debugPrint(json[0]["slug"].stringValue) //print value of slug property 
      debugPrint(json[0]["title"]["rendered"].stringValue) //print nested value of title 
     } 
    }) 
+0

哦,哇,这真的很好!我只是想知道,为了使标题变为var,我需要做些什么,所以我可以使用它来操纵TableView? – Flowne