Alamofire POST请求中如何保留值为nil的JSON键
Alamofire 5.6.2 保留nil字段为null的解决方案
问题场景
你使用Alamofire 5.6.2,配置了如下JSON编码器:
let encoder = JSONParameterEncoder.json() encoder.encoder.dateEncodingStrategy = .formatted(DateFormatter.standard) encoder.encoder.keyEncodingStrategy = .convertToSnakeCase
并在POST请求中使用该编码器处理SampleRequest结构体实例:
struct SampleRequest: Codable { var param1: Bool var param2: Float? }
当前遇到的问题是:当param2为nil时,请求体中不会包含该键,导致后端无法区分“键不存在(不做处理)”和“键存在且值为null(需设置对应字段为null)”的业务逻辑。
解决方案
Swift默认的JSONEncoder会跳过值为nil的可选字段,要实现保留键并编码为null的需求,可采用以下两种方案:
方案一:手动实现结构体的encode(to:)方法
在目标结构体中手动实现编码逻辑,强制编码所有字段(包括nil的可选字段):
struct SampleRequest: Codable { var param1: Bool var param2: Float? func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(param1, forKey: .param1) // 强制编码param2,nil时会自动转为null try container.encode(param2, forKey: .param2) } }
默认自动合成的Codable实现会忽略nil可选字段,手动实现后即可确保字段始终出现在请求体中,nil值对应JSON的null。
方案二:使用属性包装器(通用方案)
如果有多个结构体需要处理,可通过属性包装器统一处理nil字段的编码:
@propertyWrapper struct NullEncodable<T>: Encodable where T: Encodable { let wrappedValue: T? func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() if let value = wrappedValue { try container.encode(value) } else { try container.encodeNil() } } } // 结构体中使用该包装器 struct SampleRequest: Codable { var param1: Bool @NullEncodable var param2: Float? }
此方案无需为每个结构体手动实现编码方法,只需给需要保留nil的可选字段添加@NullEncodable包装器即可。
修改完成后,原Alamofire的编码器配置无需调整,请求体中会自动包含nil字段对应的键和null值,满足后端的业务区分需求。
内容的提问来源于stack exchange,提问作者Azurlake
相关产品推荐
相关产品推荐

