起こったこと
URLSessionでユーザー情報を取得すると、以下のようにdataにバックスラッシュが入っていてdecodeできない。
{\"id\":11111,\"name\":\"AAAAA\",\"screen_name\":\"AAAAA\",\"created_at\":\"2021-12-20T10:07:34+09:00\",\"updated_at\":\"2022-01-05T20:27:56+09:00\",\"icon\":\"https://img.esa.io/uploads/production/users/11111/icon/thumb_m_c05b9b963ccb73ee2582c9259f9801de.jpg\",\"email\":\"aaaaa@gmail.com\"}
requestURLを直接webで検索したらバックスラッシュが入っていないデータが表示された。
取得したいAPI情報はこちら
試したこと
func start<T: Decodable>(responseType: T.Type, completionHandler: @escaping ((Result<NetworkResult<T>, Error>) -> Void)) {
var request = URLRequest(url: url)
// https://api.esa.io/v1/user
request.httpMethod = method.rawValue //GET
if let accessToken = NetworkRequest.accessToken {
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
}
let session = URLSession.shared.dataTask(with: request) { data, response, error in
guard let response = response as? HTTPURLResponse else {
DispatchQueue.main.async {
completionHandler(.failure(RequestError.invalidResponse))
}
return
}
guard
error == nil,
let data = data
else {
DispatchQueue.main.async {
let error = error ?? NetworkRequest.RequestError.otherError
completionHandler(.failure(error))
}
return
}
print(String(data: data, encoding: .utf8)!) //バックスラッシュが入っているのを確認
if let object = try? JSONDecoder().decode(T.self, from: replacedData) { //Userでdecode
DispatchQueue.main.async {
if let user = object as? User {
NetworkRequest.username = user.name
}
completionHandler(.success((response, object)))
}
return
} else {
DispatchQueue.main.async {
completionHandler(.failure(NetworkRequest.RequestError.otherError))
}
}
}
(実行環境)
- M1 Macbook / OS12~ (Monteray)
- Xcode バージョン13~
試したこと
原因がわからなかったので、ゴリ押しでdataの中身からバックスラッシュを削除してみた。
guard
error == nil,
let data = data,
let replacedData = String(data: data, encoding: .utf8)? //一旦Stringにする
.replacingOccurrences(of: "\\", with: "") //バックスラッシュを削除
.data(using: .utf8) //再度Dataに変換
これでprintしたところ、確かにバックスラッシュは消えたのだが、decodeは失敗した。
解決方法
どうやら、バックスラッシュはprintした時には表示されるけれど、実際はついていなかった。
参考
https://www.javadrive.jp/cstart/num/index5.html
decodeエラーは単にUserモデルの型が一部間違っていた為に起こってしまっていた。
だいぶ混乱して解決に時間がかかってしまった。。
コメント