使用 Alamofire 序列化有效 JSON 数据时出错 "Garbage at end"

Error "Garbage at end" when serializing valid JSON data with Alamofire

我的代码 return 一个 Code=3840 "Garbage at end." 当我试图将我的请求数据保存到我的 api ... JSON return 是a 根据 jsonlint 的 JSON 有效(使用 Postman 测试):

{
    "error": 0,
    "message": "transaction_completed"
}

这是我的代码:

func request(urle : url, parameters : Parameters, completion: @escaping (JSON) -> Void)
{
    Alamofire.request(getUrl(urlw: urle), method: .post, parameters: parameters).responseJSON
    {
        response in
        if response.data != nil {
            do{
                let json = try JSON(data: response.data!)
                completion(json)
            }catch{
                print(error)
            }
        }
    }
}

这是我调用 request function:

的时候
let parameters: Parameters=[
    "key" : user.key,
    "uid": user.id
]
api.request(urle: .buyStack, parameters: parameters) { json in
    print(json)
}

我哪里错了?

显然你的 JSON 无效,它最后有一些无效值。

要做的第一件事。为了保持逻辑,你可以使用force unwrap(使用!)因为它是调试。我不确定这段代码是否编译通过,这只是一个逻辑演示。

let responseString = String(data: response.data, encoding: .utf8)
print("responseString: \(responseString)")

这给出:

{"error":1,"message":"Undefined APIKey"}[]

末尾有多余的[],所以不是有效的JSON。你可以要求开发人员修复它。如果你真的不能,或者想在他们那边进行时继续开发,你可以删除额外的 [].

您可以检查this answer删除最后两个字符,然后:

let cleanResponseJSONString = //check the linked answer
let cleanResponseData = cleanResponseJSONString.data(encoding: .utf8)
let json = try JSON(data: cleanResponseData)

旁注和调试想法(如果更复杂):

我要求 print("data: \(response.data as! NSData)") 因为这会打印十六进制数据。您的问题可能是由于最后一个不可见的字符引起的。如果你不认识他们,至少你可以做的是根据以前的回答:

let jsonString = "{\"error\":1,\"message\":\"Undefined APIKey\"}" (that's almost reponseString)
let jsonData = jsonString.data(encoding: .utf8)
print("jsonData: \(jsonData as! NSData)")

并比较一下结局。

调试器提示,您可以使用 之类的答案将 hexDataString 转换为 Data 并从中调试。我建议在之前添加 space、“<”和“>”删除,这样您就可以轻松地从调试器输出中 copy/paste 它。 为什么?如果需要很长时间(多次操作)才能找到问题所在(登录应用程序、执行某些操作等),这可以节省您在另一个应用程序(Playground、AppDelegate 开始时等)上调试它的时间。 ).

之后不要忘记删除所有调试代码 ;)

与问题无关:

if response.data != nil {
        do {
            let json = try JSON(data: response.data!)
            ...
        } catch {
        ...
    }
}

应该是:

if let data = response.data {
        do {
            let json = try JSON(data: data)
            ...
        } catch {
        ...
    }
}

使用if letguard let解包,避免使用强制解包。