首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同字典类型数组的快速编码

不同字典类型数组的快速编码
EN

Stack Overflow用户
提问于 2020-07-15 23:15:11
回答 1查看 484关注 0票数 0

我有JSON数据,它是一个字典数组,其中第一个项与其他数组项不同。

示例JSON

代码语言:javascript
复制
[
  {
    "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"
  }
]

我使用的是可编码的,我的结构看起来像这样

代码语言:javascript
复制
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从网络请求方法解码

代码语言:javascript
复制
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我试过

  1. I通过网络请求将'DashboardSummary‘结构作为可编码的结构传递给出了第一个项的结果,以及数组其余部分的零值。

  1. I尝试了init(从解码器:解码器)和func编码(到编码器:编码器),但不幸的是,init对我无效。

我怎么才能避开这一切?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-15 23:42:22

首先,您需要创建第三个可以表示数组的结构,例如:

代码语言:javascript
复制
struct Response : Codable {
    var dashboardSummary: DashboardSummary?
    var daySummaries: [DaySummary]
    
    enum CodingKeys: CodingKey {
        case dashboardSummary, daySummaries
    }
}

然后,您需要实现init(from:)encode(to:)来进行自定义编码。

您可以使用unkeyedContainer对其进行解码/编码。解码时,您继续从容器while解码容器--容器不是isAtEnd

代码语言:javascript
复制
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常量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62925098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档