使用Alamofire序列化有效JSON数据时出现错误“结尾处的垃圾”

时间:2018-10-23 08:26:36

标签: json swift alamofire swifty-json

当我尝试将请求的数据保存到api时,我的代码返回Code=3840 "Garbage at end."……JSON返回是符合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)
}

请问我哪里出错了?感谢您的回复

1 个答案:

答案 0 :(得分:1)

因此,显然您的JSON无效,它的末尾包含一些无效值。

第一件事。为了保持逻辑,可以使用强制展开(使用!),因为它是调试程序。我不确定该代码是否可以编译,这只是逻辑表示。

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)")

比较一下结果。

调试器技巧,您可以使用诸如this one之类的答案将hexDataString转换为Data并从中进行调试。我建议在前面添加一个空格,“ <”和“>”,以便您可以轻松地从调试器输出中复制/粘贴该空格。 为什么?如果要解决问题的时间很长(很多操作)(在应用程序中登录,执行某些操作等),则可以节省您在另一个应用程序(游乐场,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进行包装,避免使用强制包装。