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

时间:2019-01-27 14:34:03

标签: ios swift codable

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

非常感谢。

2 个答案:

答案 0 :(得分:0)

您需要

SET @match = '12345';

SELECT
    col1,
    CASE 
        WHEN LENGTH(col1) > LENGTH(@match) THEN 'longer'
        WHEN LENGTH(col1) < LENGTH(@match) THEN 'shorter'
        ELSE 'same'
    END result
FROM mytable
WHERE col1 REGEXP @match OR @match REGEXP col1;

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
}

正确的json

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

答案 1 :(得分:0)

我添加了一个新的主结构

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
  }