Swift Alamofire 无法解析 POST 请求中的响应 JSON 字符串

Posted

技术标签:

【中文标题】Swift Alamofire 无法解析 POST 请求中的响应 JSON 字符串【英文标题】:Swift Alamofire can not parse the response JSON string in POST request 【发布时间】:2021-05-25 00:55:42 【问题描述】:

一个 POST http 请求:

 task.request = sessionManager?.request(url!, method: method, parameters: paramters, encoding: JSONEncoding.prettyPrinted, headers: nil).responseJSON  response in
      task.handleResponse(response: response)
 

响应是这样的 JSON 字符串:

\"Data\":\"ArrayOfItems\":[\"ActualQty\":\"5.0\",\"BatchManaged\":true,\"ArrayOfBatches\":[\"BatchNumber\":1,\"Counted\":\"ADD\", \"Quantity\":10,\"BatchNumber\":2,\"Counted\":\"ADD\", \"Quantity\":10],\"LineNum\":\"1\",\"ItemCode\":\"M1001-L\",\"WarehouseCode\":\"Store\"],\"Comments\":\"Ht\",\"DocEntry\":\"1\",\"Quantiry\":\"123\",\"Initials\":\"RT\",\"PromptAnswerValue\":[]

Alamofire 无法解析响应 JSON 字符串。错误不断:

responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "No string key for value in object around character 40." UserInfo=NSDebugDescription=No string key for value in object around character 40.))

调试,'let json = try JSONSerialization.jsonObject(with: validData, options: options)' 行失败。见附件流动:

validData 是有价值的。为什么会这样?

我写了一个演示,我可以接收响应json字符串,代码如下:

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("\(jsonData.length)", forHTTPHeaderField: "Content-Length")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = jsonData as Data
    let session = URLSession.shared
    let task = session.dataTask(with: request as URLRequest) (
        data, response, error) in

        guard let data = data, let _:URLResponse = response, error == nil else 
            print("error")
            return
        
        let dataString =  String(data: data, encoding: String.Encoding.utf8)
        let dict = self.getDictionaryFromJSONString(jsonString: dataString!)
        print(dict)
    
    task.resume()

用过的URLSession可以做到这一点,但是为什么Alamofire不能呢?是我使用的问题吗?请指教。

谢谢。

【问题讨论】:

【参考方案1】:

我已经解决的问题。这是由响应中的无效 JSON 字符串引起的。

    调试如流:

在此处调试并在控制台中执行此操作

po String(data: validData, encoding: String.Encoding.utf8)
    检查 JSON 字符串是否有效。

此外,请注意:使用 JSONEncoding.prettyPrinted。

【讨论】:

以上是关于Swift Alamofire 无法解析 POST 请求中的响应 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

如何在 Swift 中解析来自 Alamofire API 的 JSON 响应?

POST 请求在 swift3 中无法使用 alamofire

无法解析响应 alamofire swift 3

Swift 3:Alamofire POST 请求参数问题

是否可以在 Swift 2.2 中使用使用 Alamofire 的 Soap API