提问人:Sagar 提问时间:7/16/2023 最后编辑:Sagar 更新时间:7/17/2023 访问量:83
使用 Alamofire 解析 Bool 响应
Parse Bool response using Alamofire
问:
我有来自团队的旧代码,他们无法解析 Bool 响应。
NetworkManager.shared().firebaseTokenService(request: APIRouter.firebasetoken(param as [String : Any]), completion: { (httpResponse, jsonData, error) in
if httpResponse?.statusCode == 200 {
if let responseText = jsonData?.boolValue {
if (responseText) {
print("Success to send fcm token")
} else {
print("Failed to send fcm token")
}
} else {
print("Invalid response format")
}
} else {
print("Failed to send fcm token", error?.localizedDescription)
}
})
func firebaseTokenService(request: URLRequestConvertible, completion: @escaping (_ httpResponse: HTTPURLResponse?, _ responseObject:JSON?, _ error: Error?) -> Void) {
session.request(request, interceptor: nil).validate().responseJSON { (response) in
switch response.result {
case .success:
let json = JSON(response.data as Any)
completion(response.response, json, nil)
case .failure(let error):
completion(nil, nil, error)
}
}
}
我在这里面临的问题是,响应严格来说是作为布尔或作为邮递员的附加图像来的。true
false
我得到成功代码 200,但总是为零。
所以请帮我解析 Bool 响应。jsonData
我无法更改代码,因为它们具有所有这些的基类,因此我必须应用的唯一更改仅在此方法中。
任何帮助将不胜感激。
答:
好吧,我无法用这些有限的信息做出具体准确的猜测,但是,似乎响应可能是错误的。我的意思是,说畸形是,服务器生成响应的方式可能存在问题。
你提到响应代码是 200,这很酷,但很糟糕,响应是很奇怪的。由于您提供的信息有限,我最好的猜测是响应不是 JSON 对象。jsonData
nil
boolean
为了处理这种情况(如果是这种情况),您可以通过更新代码来处理纯文本响应:
NetworkManager.shared().executeWith(request: APIRouter.firebasetoken(param)) { (httpResponse, jsonData, error) in
if httpResponse?.statusCode == 200 {
if let responseText = jsonData?.stringValue {
if responseText == "true" {
print("Success to send fcm token")
} else {
print("Failed to send fcm token")
}
} else {
print("Invalid response format")
}
} else {
print("Failed to send fcm token", error?.localizedDescription)
}
}
您还可以检查服务器是否正确设置了标头。应将其设置为指示响应采用 JSON 格式。但我对此没有最好的了解。Content-Type
application/json
我们可以通过其他信息了解您的问题。如果我弄错了你的问题,请纠正我。希望我们能解决它。
评论
true
是有效的 JSON。
不知道你是怎么进去的,很难说出哪里出了问题。jsonData
(httpResponse, jsonData, error)
但是,如果我们使用 ,只有一个布尔值作为 JSON 是有效的,这有点奇怪(即不常见),但有效的 JSON。
但是为了能够解析它,我们需要向 .let data = Data("true".utf8)
JSONSerialization
let value = try JSONSerialization.jsonObject(with: data) //Fails
let value = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed) //Success
您需要使用应该允许 , , 作为顶层,而不仅仅是 /(即“列表”或“对象”)。.fragmentsAllowed
String
Number
Bool
Array
Dictionary
您也可以直接使用:Codable
let value = try JSONDecoder().decode(Bool.self, from: data) //Success
看到,我怀疑你使用 SwiftyJSON(或同化),如果可能的话,我强烈建议使用。.stringValue
.bool
Codable
旁注,在编码中(因此可能在某个时候在解码中),由于iOS版本,可能会有限制,请参阅相关问题
使用 SwiftyJSON,您需要允许片段。
为此,请执行以下操作:
let json = JSON(response.data as Any)
===>
let json = try? JSON(data: response.data, options: .fragmentsAllowed)
然后,你应该能够做到.jsonData.boolValue
评论
firebaseToken
httpResponse
body
executeWith(request:)
jsonData
httpResponse
JSONSerialization
.fragmentsAllowed
options
SwiftyJSON
jsonData