首页 > 解决方案 > 如何在 Swift 4 和 Alamofire 中通过可编码解析 json 数据包括页码

问题描述

我是 Swift 的新手,我很困惑通过使用 Codable 来获取数据而不是使用 SwiftyJson。格式 Json 数据类型如下:

    {
  "current_page": 1,
  "total_page": 407,
  "new_entries": [
    {
      "id": 10174,
      "title": "Hello",
      "description": "Hello",
      "categories": "women",
      "image": "imagelink",
      "url": "urllink",
      "date": "time",
      "is_favorite": false
    },
    {
      "id": 9237,
      "title": "hi",
      "description": "hi",
      "categories": "skincare",
      "image": "imagelink",
      "url": "url",
      "date": "time",
      "is_favorite": false
    },

那么我如何获取条目并解码并保存为可编码的

let decoder = JSONDecoder()

            do {
                let feed = try decoder.decode(Feed.self, from: jsonData)
                print(feed.title)
            } catch {
                print(error.localizedDescription)
            }

我停在下面,不知道如何将 json["new_entries"] 转换为字符串类型和解码。

    Alamofire.request("https://abc.jp/api/category/women_all/?page=1", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in
        debugPrint(response)

        if let JSON = response.result.value as? NSDictionary {
            GlobalVariables.sharedManager.pageCurr = JSON["current_page"] as? Int
            GlobalVariables.sharedManager.pageTotal = JSON["total_page"] as? Int

            if let entries = JSON["new_entries"] as? NSArray{

                for entry in entries {

                    if let entry = entry as? NSDictionary {

                        for (key, value) in entry {
                            print("\(key) - \(value)")
                        }
                    }
                }
            }
        }

我的饲料结构

struct Feed: Codable {

    enum CodingKeys: String, CodingKey {
        case id
        case title
        case description
        case categories
        case image
        case url
        case date
        case favorite = "is_favorite"
    }

    let id: Int
    let title: String
    let description: String
    let categories: String
    let image: String
    let url: String
    let date: String
    let favorite: Bool
}

非常感谢。

标签: iosswiftcodable

解决方案


你需要

struct Root: Codable {
    let currentPage, totalPage: Int
    let newEntries: [Feed]

}

struct Feed: Codable {
    let id: Int
    let title, description, categories, image: String
    let url, date: String
}

Alamofire.request("https://abc.jp/api/category/women_all/?page=1", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseData { response in
      debugPrint(response)
      guard let data = response.data else { return } 
        do { 
            let de = JSONDecoder()
            de.keyDecodingStrategy = .convertFromSnakeCase
            let res = try de.decode(Root.self, from: data) 
            print(res.currentPage)
            print(res.totalPage)
            print(res.newEntries)
        }
        catch { 
            print(error)
        }
}

正确的json

{
    "current_page": 1,
    "total_page": 407,
    "new_entries": [
    {
    "id": 10174,
    "title": "Hello",
    "description": "Hello",
    "categories": "women",
    "image": "imagelink",
    "url": "urllink",
    "date": "time",
    "is_favorite": false
    },
    {
    "id": 9237,
    "title": "hi",
    "description": "hi",
    "categories": "skincare",
    "image": "imagelink",
    "url": "url",
    "date": "time",
    "is_favorite": false
    }]
}

推荐阅读