Swift中PalletScan无法编码嵌套MovementScan对象的问题求助
你遇到的问题其实是自定义CodingKeys时遗漏了嵌套属性的键,根本不需要把MovementScan的编码逻辑搬到PalletScan里,只需要简单修改PalletScan的CodingKeys就能解决。
问题根源
当你为PalletScan定义了自定义CodingKeys后,Swift的自动Codable实现只会处理CodingKeys中列出的属性。你的CodingKeys里只包含了deliveryId、userId、timestamp三个键,而pallets数组不在其中,所以编码时直接被忽略了——这就是为什么嵌套的MovementScan完全没出现在JSON里。
解决方案
只需要在PalletScan的CodingKeys中添加pallets对应的键即可。如果你的API接收的字段名和属性名一致(比如叫pallets),直接加case pallets;如果API里的字段名是其他名称(比如Pallets),就指定对应的rawValue:
struct PalletScan: Codable { // ... 其他属性保持不变 ... var pallets: [MovementScan] = [MovementScan]() enum CodingKeys: String, CodingKey { case deliveryId = "TOID" case userId = "UserId" case timestamp = "TimeStamp" case pallets = "Pallets" // 这里添加,根据实际API字段名调整rawValue } // ... 其他初始化方法保持不变 ... }
为什么不需要移动编码逻辑?
MovementScan本身已经正确实现了Codable(你自定义了init(from:)和encode(to:)),只要PalletScan的Codable实现能识别pallets属性,就会自动递归调用MovementScan的编码方法,完全不需要把编码逻辑合并到父结构体里。
额外提示
如果你不需要把tempPalletNr、tempLocation、tempPalletType这些属性编码到JSON里,那它们不需要加到CodingKeys里——这部分是正确的,只有需要序列化的属性才需要在CodingKeys中声明。
内容的提问来源于stack exchange,提问作者Robert

