Alamofire无效值,字符0周围的值无效。

101
Alamofire.request(.GET, "url").authenticate(user: "", password: "").responseJSON() {
    (request, response, json, error) in
    println(error)
    println(json)

}

这是我使用Alamofire进行某个请求时的问题,有时它能够正常工作,但有时会出现以下错误:

Optional(Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x78e74b80 {NSDebugDescription=Invalid value around character 0.})

我读过一些资料,说这可能是由于无效的JSON导致的。但响应是一个包含校验过为有效的JSON字符串。该字符串包含了一些å ä ö字符和一些HTML标签。
为什么有时候会出现这个错误?

14
当我遇到这个错误时,我喜欢注释掉 responseJSON() { ... } 块,并替换为 .responseString { _, _, s, _ in println(s) }。这样可以让你看到返回的 JSON,以寻找任何不符合 responseJSON 解析条件的文本。请注意,此操作不会改变原意。 - ad121
响应状态码是什么? - Sahil Kapoor
1
我得到了状态码200,但是出现了这个错误。啊啊啊。在我的情况下,大脑死亡:)。实际上我没有从服务器返回JSON。问题解决了。 - Chris Prince
如果您使用.POST方法,可能会起作用。 - Surjeet Rajput
请检查您的网址 :) - Alok
21个回答

153

我也遇到了同样的问题。我尝试使用 responseString 替代 responseJSON,然后它就可以工作了。我猜这是在与 django 一起使用 Alamofire 时出现的一个 bug。


3
谢谢你指出这一点。我之前使用的是responseJSON,但实际上从服务器返回的是XML格式的响应!这避免了我头痛的情况 :) - C0D3
@Smit Thakkar,你如何从字符串中解析JSON响应?我收到了这个响应,但由于HTML错误消息,我无法使用responseJSON,但我仍然需要处理JSON。 "<br />\n<b>注意</b>:在<b>server/file</b>的第<b>357</b>行中未定义偏移量:<b>通知</b><br />\n<br />\n<b>注意</b>:在<b>server/file</b>的第<b>358</b>行中未定义偏移量:<b>通知</b><br />\n{"status":"success","desc":"all proceed","data":[{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZW50aS5teCIsImF1ZCI6Imh0dHBzOlwvXC9yZW50aS5teCIsImlhdCI6MTQ5MzYwMzY2MCwiZXhwIjox"}]}" - Cesar Mtz
1
你的回复混杂了HTML代码,你需要解析HTML并获取JSON字符串并将其转换为字典。我建议尝试使用SwiftSoup或者查看https://dev59.com/A10Z5IYBdhLWcg3wxCuQ以获取更好的解析HTML的替代方案。 - Smit
再次进行上述更改后,返回以下错误信息:“您正在查找的资源可能已被删除、名称已更改或暂时不可用。”但在“Postman”上却可以正常工作。 - Vaibhav Saran
需要授权才能强制应用,然后您不需要将其更改为“responcestring”,保持responseJSON不变。 - Yogesh Dalavi
显示剩余5条评论

11
在我的情况下,我的服务器网址错误。检查你的服务器网址!!

这对我来说是个问题。我简直不敢相信我错过了它。我必须养成先检查URL的习惯,而且一定要坚持! - LondonGuy

9

我在使用Alamofire上传多部分表单中的图像时遇到了同样的错误。

multipartFormData.appendBodyPart(data: image1Data, name: "file")

我通过替换来修复了它。
multipartFormData.appendBodyPart(data: image1Data, name: "file", fileName: "myImage.png", mimeType: "image/png")

希望这能对某些人有所帮助。

我花了好几个小时才弄明白这个问题。我想知道为什么这个解决方案有效...谢谢! - MVZ

8

希望这能帮到您

Alamofire.request(.GET, "YOUR_URL")
     .validate()
     .responseString { response in
         print("Success: \(response.result.isSuccess)")
         print("Response String: \(response.result.value)")
     }

是的,兄弟。我受到了你的回答的启发。我刚刚上传了代码,供任何新手使用。 - Krutarth Patel

7
同样的问题也发生在了我身上,实际上它是一个服务器问题,因为内容类型没有被设置。
添加:
.validate(contentType: ["application/json"])

将请求链解决了对我很有帮助。

Alamofire.request(.GET, "url")
        .validate(contentType: ["application/json"])
        .authenticate(user: "", password: "")
        .responseJSON() { response in
            switch response.result {
            case .Success:
                print("It worked!")
                print(response.result.value)
            case .Failure(let error):
                print(error)
            }
        }

4

这是我解决 "Invalid 3840 Err" 的方法。

错误日志:

 responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
  1. 请求使用的编码类型,应该在服务器端接受所使用的编码类型。

为了知道编码方式,我必须逐个运行以下所有编码类型:

默认/方法相关/查询字符串/HTTP正文

    let headers: HTTPHeaders = [
        "Authorization": "Info XXX",
        "Accept": "application/json",
        "Content-Type" :"application/json"
    ]

    let parameters:Parameters = [
        "items": [
                "item1" : value,
                "item2": value,
                "item3" : value
        ]
    ]

    Alamofire.request("URL",method: .post, parameters: parameters,encoding:URLEncoding.queryString, headers: headers).responseJSON { response in
        debugPrint(response)
     }
  1. 还要根据我们接收到的响应使用相应的 response
    • responseString
    • responseJSON
    • responseData

如果响应不是 JSON,只是字符串,请使用 responseString

例如:在登录/创建令牌 API 的情况下:

"20dsoqs0287349y4ka85u6f24gmr6pah"

responseString


4

我曾经遇到过同样的错误,但我找到了解决方法。

注意1:这不是Alarmofire的错误,而是服务器的错误。

注意2:你不需要将"responseJSON"更改为"responseString"。

public func fetchDataFromServerUsingXWWWFormUrlencoded(parameter:NSDictionary, completionHandler: @escaping (_ result:NSDictionary) -> Void) -> Void {

        let headers = ["Content-Type": "application/x-www-form-urlencoded"]
        let completeURL = "http://the_complete_url_here"
        Alamofire.request(completeURL, method: .post, parameters: (parameter as! Parameters), encoding: URLEncoding.default, headers: headers).responseJSON { response in

            if let JSON = response.result.value {
                print("JSON: \(JSON)") // your JSONResponse result
                completionHandler(JSON as! NSDictionary)
            }
            else {
                print(response.result.error!)
            }
        }
    }

3
我使用这个头部解决了问题: let header = ["Content-Type": "application/json", "accept": "application/json"]

2
在我的情况下,URL 中有一个额外的 / 。最初的回答保留了 HTML 标签。

1
在使用Alamofire时,添加编码:JSONEncoding.default后,错误得以解决。
  Alamofire.request(urlString, method: .post, parameters: 
  parameters,encoding: 
  JSONEncoding.default, headers: nil).responseJSON {  
   response in
   switch response.result {
                   case .success:
                    print(response)
                    break

                    case .failure(let error):
                     print(error)
        }
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接