使用 Alamofire 解析 Bool 响应

Parse Bool response using Alamofire

提问人:Sagar 提问时间:7/16/2023 最后编辑:Sagar 更新时间:7/17/2023 访问量:83

问:

我有来自团队的旧代码,他们无法解析 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)
            }
        }
    }

我在这里面临的问题是,响应严格来说是作为布尔或作为邮递员的附加图像来的。truefalse

enter image description here

我得到成功代码 200,但总是为零。 所以请帮我解析 Bool 响应。jsonData

我无法更改代码,因为它们具有所有这些的基类,因此我必须应用的唯一更改仅在此方法中。

任何帮助将不胜感激。

iOS版 斯威夫特 阿拉莫火

评论

0赞 Sagar 7/16/2023
@JoakimDanielson JSON
0赞 Sagar 7/16/2023
如果响应获得 JSON 正文作为响应,它将存储在 jsonData 中,但我没有在 JSON 正文中得到响应,只是获取布尔值
0赞 Paulw11 7/16/2023
你将不得不查看你的代码,并弄清楚它是如何尝试解码JSON的。可能是响应内容类型标头不是它所期望的,或者是其他原因。我们无法帮助您处理显示的代码。您还可以查看对象,看看它是否包含返回的对象,然后自己解析它firebaseTokenhttpResponsebody
0赞 Larme 7/17/2023
您需要显示 的代码,您是如何从中确切获取的,并且您可能还需要打印 。executeWith(request:)jsonDatahttpResponse
0赞 Larme 7/17/2023
例如,如果您使用 ,则需要在参数中使用(但这也可能取决于 iOS 版本)......但是由于我不知道你用了什么(过时了?),所以很难说......因此,请展示该方法的代码,以及您如何构造.JSONSerialization.fragmentsAllowedoptionsSwiftyJSONjsonData

答:

1赞 leopanic13 7/16/2023 #1

好吧,我无法用这些有限的信息做出具体准确的猜测,但是,似乎响应可能是错误的。我的意思是,说畸形是,服务器生成响应的方式可能存在问题。

你提到响应代码是 200,这很酷,但很糟糕,响应是很奇怪的。由于您提供的信息有限,我最好的猜测是响应不是 JSON 对象。jsonDatanilboolean

为了处理这种情况(如果是这种情况),您可以通过更新代码来处理纯文本响应:

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-Typeapplication/json

我们可以通过其他信息了解您的问题。如果我弄错了你的问题,请纠正我。希望我们能解决它。

评论

0赞 Paulw11 7/16/2023
true是有效的 JSON。
0赞 leopanic13 7/16/2023
我想过,但成为有效的 JSON 不应该是“真的”吗?带引号?
0赞 Paulw11 7/16/2023
那将是一个字符串。不带引号,它是一个布尔值
0赞 Sagar 7/17/2023
@leopanic13:感谢您的输入。我知道直接得到 bool 的响应很奇怪,我已经要求后端检查,但似乎更新它需要很多过程。jsonData 采用 JSON 格式,但响应以 BOOL TRUE 或 FALSE 格式表示。所以你的条件如果让 responseText = jsonData?.stringValue 不起作用,因为 jsonData 始终为 nil。需要一些东西,当状态码为 200 时,它将直接解析 bool 响应。谢谢
0赞 Larme 7/17/2023
stackoverflow.com/questions/76695495/......应该是解析JSON的正确方法,它只是一个布尔值
0赞 Larme 7/17/2023 #2

不知道你是怎么进去的,很难说出哪里出了问题。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

您需要使用应该允许 , , 作为顶层,而不仅仅是 /(即“列表”或“对象”)。.fragmentsAllowedStringNumberBoolArrayDictionary

您也可以直接使用:Codable

let value = try JSONDecoder().decode(Bool.self, from: data) //Success

看到,我怀疑你使用 SwiftyJSON(或同化),如果可能的话,我强烈建议使用。.stringValue.boolCodable

旁注,在编码中(因此可能在某个时候在解码中),由于iOS版本,可能会有限制,请参阅相关问题

使用 SwiftyJSON,您需要允许片段。

为此,请执行以下操作:

let json = JSON(response.data as Any)

===>

let json = try? JSON(data: response.data, options: .fragmentsAllowed)

然后,你应该能够做到.jsonData.boolValue