ios - 如何在 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
}
非常感谢。
解决方案
你需要
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
}]
}
推荐阅读
- javascript - Leaflet.js:maxZoom 和 minZoom 不起作用
- c# - 如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS
- javascript - 元素的类名在循环中未定义
- 的子节点
- openid - ADFS 2019 登录页面未重定向到我的应用程序
- amazon-web-services - 如何在仪表板中清除 aws 批处理作业历史记录
- python-3.x - 在熊猫中将几个替换语句组合成一个
- java - java - 在构造函数中创建时,如何在java中关闭ExecuterService..?
- java - 如何使用java Process知道文件是否关闭
- qt - QtQuick 2 中 BusyIndicator 的高 CPU 使用率
- java - 验证注释约束不起作用