【发布时间】:2020-10-20 01:20:05
【问题描述】:
在 20 年的开发过程中,我总是通过在线搜索,特别是在 Stackoverflow 上搜索来找到我开发问题的所有答案。但这一次,为了我的生命,我无法找到解决方案: 我正在开发一个使用公共 api 来搜索公共交通时间表的 iOS 应用程序。一切正常,尤其是安卓版本。但在 iOS 中,如果响应包含无效字符,则序列化过程会失败。
我正在使用 Alamofire 5.2.1、Swift 5、Xcode 11.5,API 是 Mentz 的 DIVA/EFA 服务,主要用于中欧(我认为)公共交通。
导致序列化失败的“坏”字符来自我想的编码问题,返回的 JSON 包含两个键
"opPublicCode":"�BB"
和
"operator":"ÖBB"
(冗余是这里的另一个问题,但没关系)。如您所见,这个德语 Ö 曾经正确表示过,但一次不正确。正是这个单个字符导致 Alamofire 生成以下错误:
responseSerializationFailed(
reason: Alamofire.AFError.ResponseSerializationFailureReason.decodingFailed
(error: Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [],
debugDescription: \"The given data was not valid JSON.\",
underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 \"Unable to convert data to string around character 7100.\"
UserInfo={NSDebugDescription=Unable to convert data to string around character 7100.})))))
这是调用api的代码,我觉得没什么特别的:
AF.request(url)
.responseDecodable(of: StaResponse.self) {(response: DataResponse<StaResponse, AFError> ) in
switch response.result {
case .success(let value):
callback(value, nil)
case .failure(let error):
callback(nil, error)
}
}
这是 Codable 对象(我忽略了“opPublicCode”的有问题的值,将其设置为 nil,因为我不需要它):
struct StaDiva : Codable {
let branch : String?
let dir : String?
let line : String?
let network : String?
let opCode : String?
let operatorName : String?
let opPublicCode : String? = nil
let project : String?
let stateless : String?
let supplement : String?
let tripCode : String?
enum CodingKeys: String, CodingKey {
case branch = "branch"
case dir = "dir"
case line = "line"
case network = "network"
case opCode = "opCode"
case operatorName = "operator"
case project = "project"
case stateless = "stateless"
case supplement = "supplement"
case tripCode = "tripCode"
}
}
我已经尝试了数千种方法,但都没有奏效。我设置了标题(Content-Encoding、Accept-Encoding、Accept),我尝试使用 Alamofire 4,在我的 Alamofire 请求中使用 .responseJSON 和 .responseString 而不是 .responseDecodable。我在我的 Codable 结构中尝试了几个选项,删除“opPublicCode”字段,将其设置为 Data 或 Any 而不是 String。但没有运气。每次响应包含此运算符(火车中,ÖBB)的结果时,它都会失败。
我能在这里做什么?有没有办法忽略这个字符,也许通过替换它?我在使用 Alamofire 时错过了什么吗?或者有没有办法在 Codable 结构中解决这个问题(但我不这么认为,因为在尝试解码之前就发生了故障)。
不用说,试图让某人对 API 进行一些更改不是一种选择。
如果您需要更多信息,我当然可以提供更多详细信息。 任何帮助将非常感激!提前致谢!
【问题讨论】:
标签: ios json swift character-encoding alamofire