不,无法以这种方式自定义 JSON 编码,因为这是JSONSerializationand的限制JSONEncoder。如果这确实是一个要求,我建议您创建自己的ParameterEncoding 来处理所有编码参数的转义。
final class EscapingJSONEncoder: ParameterEncoding {
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var urlRequest = try urlRequest.asURLRequest()
guard let parameters = parameters else { return urlRequest }
do {
let data = try JSONSerialization.data(withJSONObject: parameters, options: [])
if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
urlRequest.httpBody = data
urlRequest.httpBody = urlRequest.httpBody.map { data in
var string = String(decoding: data, as: UTF8.self)
string = string.replacingOccurrences(of: #"\""#, with: #"\\\""#)
return Data(string.utf8)
}
} catch {
throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
}
return urlRequest
}
}
Data由于-> String->转换,这相当低效Data,但对于小型有效负载来说应该不会太糟糕。