Ios 将JSON响应解析为结构
我正在使用Alamofire并从JSON中的API中获取数据。 我想将数据使用到结构中。 答复如下:Ios 将JSON响应解析为结构,ios,json,swift,alamofire,Ios,Json,Swift,Alamofire,我正在使用Alamofire并从JSON中的API中获取数据。 我想将数据使用到结构中。 答复如下: { "status" : 1, "data" : [ { "classes" : [ ], "day" : "Wednesday" }, { "classes" : [ { "time" : "1:30 PM", "available_spots" : 2, "trainer" : "Ahmed Jasim", "
{
"status" : 1,
"data" : [
{
"classes" : [
],
"day" : "Wednesday"
},
{
"classes" : [
{
"time" : "1:30 PM",
"available_spots" : 2,
"trainer" : "Ahmed Jasim",
"thumbnail" : "\/uploads\/classes\/6\/files\/class_6_15555066955cb72607131886.71740331.jpg",
"id" : 6,
"name" : "Gym Class C"
}
],
"day" : "Thursday"
},
{
"classes" : [
],
"day" : "Friday"
},
{
"classes" : [
],
"day" : "Saturday"
},
{
"classes" : [
{
"available_spots" : 2,
"id" : 1,
"trainer" : "Ahmed Jasim",
"name" : "Karate",
"thumbnail" : "\/uploads\/classes\/1\/files\/class_1_15548800215cad9615e62404.41767774.jpg",
"time" : "5:00 PM"
}
],
"day" : "Sunday"
},
{
"classes" : [
{
"thumbnail" : "\/uploads\/classes\/1\/files\/class_1_15548800215cad9615e62404.41767774.jpg",
"available_spots" : 2,
"time" : "11:00 AM",
"name" : "Karate",
"id" : 1,
"trainer" : "Ahmed Jasim"
},
{
"trainer" : "Jalal Hassan",
"available_spots" : 20,
"thumbnail" : "\/uploads\/classes\/2\/files\/class_2_15548819805cad9dbc7b9a80.11639647.jpg",
"time" : "4:00 PM",
"name" : "Gym Class B",
"id" : 2
}
],
"day" : "Monday"
},
{
"classes" : [
{
"name" : "Gym Class B",
"trainer" : "Jalal Hassan",
"time" : "9:00 AM",
"available_spots" : 20,
"id" : 2,
"thumbnail" : "\/uploads\/classes\/2\/files\/class_2_15548819805cad9dbc7b9a80.11639647.jpg"
}
],
"day" : "Tuesday"
}
],
"message" : "Retrieved successfully",
"success" : true
}
我想得到“day&classes”并在结构中使用它们。
我使用的结构如下所示
struct section {
day: String!
classes: [String]!
}
所以我想得到当天的课程并储存它们。
对结构的调用:
var sections = [Section(day: "Monday", classes: ["A","B","C"]]
我想要实现的是得到所有的天和它的类&如果一天没有类,它将只是一个空数组
但我不确定这是否可能
这是Alamofire请求中的代码:
let classesJSON: JSON = JSON(response.result.value!)
if response.data != nil {
for index in 0..<classesJSON["data"].count {
var sections = Section(day: classesJSON["data"][index]["day"].stringValue, classes: [])
for data in classesJSON["data"].arrayValue {
for value in data["classes"].arrayValue {
sections.classes.append(value["name"].stringValue)
//sections.classes[index] = value["name"].stringValue
}
}
print(sections)
}
}
^这就是我得到的,但是我想把它们分开,这样我可以得到当天的课程,不是所有的课程,你可以稍微改变你的循环
你可以稍微改变你的循环
我建议放弃SwiftyJSON,改用带有
Codable
的真实模型对象
使用以下结构解析数据:
struct APIResponse: Codable {
let status: Int
let data: [ClassData]
let message: String
let success: Bool
}
struct ClassData: Codable {
let classes: [Class]
let day: String
}
struct Class: Codable {
let time: String
let availableSpots: Int
let trainer, thumbnail: String
let id: Int
let name: String
enum CodingKeys: String, CodingKey {
case time
case availableSpots = "available_spots"
case trainer, thumbnail, id, name
}
}
struct Section {
let day: String
let classes: [String]
}
do {
let response = try JSONDecoder().decode(APIResponse.self, from: json)
let classesPerDay: [String: [Class]] = response.data.reduce(into: [:]) {
$0[$1.day, default: []].append(contentsOf: $1.classes)
}
let sections = classesPerDay.map { Section(day: $0, classes: $1.map { $0.name }) }
print(sections)
} catch {
print(error)
}
我建议放弃SwiftyJSON,改用带有
Codable
的真实模型对象
使用以下结构解析数据:
struct APIResponse: Codable {
let status: Int
let data: [ClassData]
let message: String
let success: Bool
}
struct ClassData: Codable {
let classes: [Class]
let day: String
}
struct Class: Codable {
let time: String
let availableSpots: Int
let trainer, thumbnail: String
let id: Int
let name: String
enum CodingKeys: String, CodingKey {
case time
case availableSpots = "available_spots"
case trainer, thumbnail, id, name
}
}
struct Section {
let day: String
let classes: [String]
}
do {
let response = try JSONDecoder().decode(APIResponse.self, from: json)
let classesPerDay: [String: [Class]] = response.data.reduce(into: [:]) {
$0[$1.day, default: []].append(contentsOf: $1.classes)
}
let sections = classesPerDay.map { Section(day: $0, classes: $1.map { $0.name }) }
print(sections)
} catch {
print(error)
}
如果您想将JSON解析为结构(一个是不够的),那么SwiftyJSON是不合适的。使用
Codable
。有无数的相关问题。如果你想把JSON解析成结构(一个还不够),那么SwiftyJSON是不合适的。使用Codable
。有无数相关的问题。
struct Section {
var day: String
var classes: [String]
}
struct APIResponse: Codable {
let status: Int
let data: [ClassData]
let message: String
let success: Bool
}
struct ClassData: Codable {
let classes: [Class]
let day: String
}
struct Class: Codable {
let time: String
let availableSpots: Int
let trainer, thumbnail: String
let id: Int
let name: String
enum CodingKeys: String, CodingKey {
case time
case availableSpots = "available_spots"
case trainer, thumbnail, id, name
}
}
struct Section {
let day: String
let classes: [String]
}
do {
let response = try JSONDecoder().decode(APIResponse.self, from: json)
let classesPerDay: [String: [Class]] = response.data.reduce(into: [:]) {
$0[$1.day, default: []].append(contentsOf: $1.classes)
}
let sections = classesPerDay.map { Section(day: $0, classes: $1.map { $0.name }) }
print(sections)
} catch {
print(error)
}