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個弱試して消してた、と思う。