繁体   English   中英

如何在Swift 4和Alamofire中解析JSON数据包括页码的编码

[英]How to parse json data include page number by codable in Swift 4 and Alamofire

我是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
}

非常感谢。

你需要

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
    }]
}

我添加了一个新的主结构

struct Main: Codable {
  let currentPage: Int
  let totalPage: Int
  let feeds: [Feed]

  enum CodingKeys: String, CodingKey {
    case currentPage = "current_page"
    case totalPage = "total_page"
    case feeds = "new_entries"
  }

}

然后使用该结构进行解码

let decoder = JSONDecoder()
do {
  let result = try decoder.decode(Main.self, from: jsonData)
  print(result.currentPage)
} catch {
  print(error)
}

或以alamofire为例

Alamofire.request("https://abc.jp/api/category/women_all/?page=1", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseData { response in
  guard let data = response.data else { return } 
  do { 
    let decoder = JSONDecoder()
    let result = try decoder.decode(Main.self, from: data)
    GlobalVariables.sharedManager.pageCurr = result.currentPage
    GlobalVariables.sharedManager.pageTotal = result.totalPage
    for feed in result.feeds {
      print(feed.id)
      //etc
    }
  } catch {
     print(error)
     // other error handling
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM