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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:40:39