Ошибка «Мусор в конце» при сериализации действительных данных JSON с Alamofire - PullRequest
0 голосов
/ 23 октября 2018

Мой код возвращает Code=3840 "Garbage at end.", когда я пытаюсь сохранить свои данные запроса в моем API ... Возвращает JSON Действительный JSON , соответствующий jsonlint (протестирован с Почтальоном):

{
    "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 голосов
/ 23 октября 2018

Так что, очевидно, ваш JSON недействителен, в конце он содержит недопустимые значения.

Первое, что нужно сделать.Ради сохранения логики вы можете использовать принудительное развертывание (используя !), потому что это отладка.Я не уверен, что этот код компилируется, это просто логическая презентация.

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

Это дает:

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

В конце есть дополнительный [], и тогдане действительный JSON.Вы можете попросить разработчика это исправить.Если вы действительно не можете или хотите продолжить развитие, пока он находится в процессе их поддержки, вы можете удалить лишний [].

Вы можете проверить этот ответ , чтобы удалить последнийдва символа, а затем:

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 и отладить его.Я бы порекомендовал добавить пробел, удаление "<" и ">", чтобы вы могли легко скопировать / вставить его из вывода отладчика.Зачем?Если долго (много манипуляций) идти туда, где находится ваша проблема (вход в приложение, определенные действия и т. Д.), Это может сэкономить ваше время для отладки в другом приложении (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, чтобы развернуть, избегайте принудительного развертывания.

...