URLSessionで取得したJSONデータにバックスラッシュが含まれている

起こったこと

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モデルの型が一部間違っていた為に起こってしまっていた。
だいぶ混乱して解決に時間がかかってしまった。。

コメント

タイトルとURLをコピーしました