使用 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 let
、guard let
解包,避免使用强制解包。
我的代码 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)")
并比较一下结局。
调试器提示,您可以使用 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 let
、guard let
解包,避免使用强制解包。