我有JSON数据,它是一个字典数组,其中第一个项与其他数组项不同。
示例JSON
[
{
"totalDays": 180,
"totalWorkingDays": 148,
"totalWorkingHours": "1184:00:00",
"totalWorkedHours": "985:23:10",
"totalShortageHours": "-199:37:50",
"avgWorkingHours": "06:39:28(83%)",
"avgShortageHours": "01:20:31(17%)",
"totalAbsents": 13,
"totalLeaves": 4
},
{
"attendanceDayCount": 1,
"attendanceDate": "21-Jan-19",
"attendanceDay": "Monday"
},
{
"attendanceDayCount": 2,
"attendanceDate": "22-Jan-19",
"attendanceDay": "Tuesday"
},
{
"attendanceDayCount": 3,
"attendanceDate": "23-Jan-19",
"attendanceDay": "Wednesday"
}
]我使用的是可编码的,我的结构看起来像这样
struct DashboardSummary : Codable {
var totalDays : Int?
var totalWorkingDays : Int?
var totalWorkingHours : String?
var totalWorkedHours : String?
var totalShortageHours : String?
var avgWorkingHours : String?
var avgShortageHours : String?
var totalAbsents : Int?
var totalLeaves : Int?
}
struct DaySummary : Codable {
var attendanceDayCount : Int?
var attendanceDate : String?
var attendanceDay : String?
}编辑: JSON从网络请求方法解码
DispatchQueue.main.async {
if let responseObject = try? JSONDecoder().decode(Response.self, from: data) {
print("responseObject", responseObject)
completion(.success(responseObject))
}
else {
let error = NSError(domain: "", code: 200, userInfo: [NSLocalizedDescriptionKey : "Failed to decode"])
completion(.failure(error))
}
}Things我试过
。
我怎么才能避开这一切?
发布于 2020-07-15 23:42:22
首先,您需要创建第三个可以表示数组的结构,例如:
struct Response : Codable {
var dashboardSummary: DashboardSummary?
var daySummaries: [DaySummary]
enum CodingKeys: CodingKey {
case dashboardSummary, daySummaries
}
}然后,您需要实现init(from:)和encode(to:)来进行自定义编码。
您可以使用unkeyedContainer对其进行解码/编码。解码时,您继续从容器while解码容器--容器不是isAtEnd。
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
dashboardSummary = try container.decodeIfPresent(DashboardSummary.self)
daySummaries = []
while !container.isAtEnd {
daySummaries.append(try container.decode(DaySummary.self))
}
}
func encode(to encoder: Encoder) throws {
var container = encoder.unkeyedContainer()
try container.encode(dashboardSummary)
for daySummary in daySummaries {
try container.encode(daySummary)
}
}如果不打算更改属性,还可以考虑使属性let常量。
https://stackoverflow.com/questions/62925098
复制相似问题