LoginSignup
8
8

More than 5 years have passed since last update.

Cloud Translation APIのJSONをSwift4のCodableで楽だった

Last updated at Posted at 2017-11-23

Codableに早く手を出せばよかった。

Googleの翻訳API「Cloud Translation API」を使ってみようと手を出すも、返ってきたJSON形式データの配列、オブジェクトにつまづく。

Swift4に加わったCodableを使ったところ、思った以上にあっさり解決した。

POSTデータ

var jsonObject = Dictionary<String,Any>()
jsonObject["q"] = "Hello"
jsonObject["source"] = "en"
jsonObject["target"] = "ja"
jsonObject["format"] = "text"

レスポンス用構造体

struct GcpTranslationJson:Codable {
    let data: Data
    struct Data:Codable {
        let translations: [Translations]
    }
    struct Translations:Codable {
        let translatedText: String
    }
}

POSTしてレスポンス処理まで

全体

func post(url urlString: String, postParameter: [String:Any]) {
    var request = URLRequest(url: URL(string: urlString)!)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    do {
        request.httpBody = try JSONSerialization.data(withJSONObject: postParameter, options: .prettyPrinted)
    } catch {
        print(error.localizedDescription)
    }

    let task = URLSession.shared.dataTask(with: request, completionHandler: { data, response, error in
        if let data = data, let response = response {
            do {
                print("JSONSerialization")
                let json = try JSONDecoder().decode(GcpTranslationJson.self, from: data)
                print(json.data.translations[0].translatedText)
            } catch {
                print("Error")
            }
        }
    })
    task.resume()
}

Codableで楽になったJSON形式データから値の引き出し。

let json = try JSONDecoder().decode(GcpTranslationJson.self, from: data)
print(json.data.translations[0].translatedText)

outputを見ると翻訳された文が出力されてた。

こんにちは

まとめ

  • Codableは楽。
  • クラウドサービスの利用者側セキュリティは適切に(API制限や管理等)
  • お財布に優しかったクラウドサービス

コードのコピペはある段階で限界がくる。社蓄ちゃんに怒られないようにコピペコードへの理解を深めよう(今回はJSON構造解説とCodable解説を読んで解決できた)。

  • 結局、Codableを使わない方法はわかってない。
  • URLSession周りも怪しい。

参考

以下、試行錯誤の残滓(一部)

GET時のレスポンス

  • URL
https://translation.googleapis.com/language/translate/v2?source=en&target=ja&q=hello&key={API Key}
  • Response
{
  "data": {
    "translations": [
      {
        "translatedText": "こんにちは"
      }
    ]
  }
}

XCodeのブレイクポイントで変数jsonを「!」マークで中を見ると

▿ 1 element
  ▿ 0 : 2 elements
    - key : "data"
    ▿ value : 1 element
      ▿ 0 : 2 elements
        - key : translations
        ▿ value : 1 element
          ▿ 0 : 1 element
            ▿ 0 : 2 elements
              - key : translatedText
              - value : こんにちは

失敗コード

2行目の部分で停止。

let jsonData = json["data"] as! [String:Any]
let jsonTranslations = jsonData["translations"] as! NSDictionary
let jsonTranslation = jsonTranslations.first as! [String:Any]
let jsonTranslatedText = jsonTranslation["translatedText"] as! String

他に20個弱試して消してた、と思う。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8