You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:25