问题描述
我无法从Google Translate生成的JSON获取第一个元素(包含翻译)。我试图以各种方式做到这一点,例如将JSON转换为数组并使用JSONSerialization,但我一直无法弄清楚。尽管此网站上存在类似的问题,但没有答案适合我。
作为示例,这是生成“您好,我想获得帮助”的英语到西班牙语翻译的内容。
let toLanguage = "es"
let textToTranslate = "Hello there,I would love some help".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
let translateURL = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=" + toLanguage + "&dt=t&dt=t&q=" + textToTranslate!
let url = URL(string: translateURL)!
let task = URLSession.shared.dataTask(with: url) { data,response,error in
print(String(data: data!,encoding: .utf8))
}
task.resume()
该打印语句返回:
("[[[\"Hola,me encantaría un poco de ayuda\",\"Hello there,I would love some help\",null,3,[[]\n]\n,[[[\"88050b4eeda80a4gb03h2aa140d8a487\",\"en_es_2020q2.md\"]\n]\n]\n]\n]\n,\"en\",[]\n]\n")
我想将“ Hola,meencantaríaun poco de ayuda”存储为字符串,任何指导将不胜感激!预先谢谢你。
解决方法
这是一个丑陋的解决方案,可以用
替换闭包的内容。if let data = data {
var reply: [Any] = []
do {
reply = try JSONSerialization.jsonObject(with: data) as? [Any] ?? []
} catch {
print(error)
}
if let next = reply.first as? [Any] {
if let next = next.first as? [Any] {
if let translation = next.first as? String {
print(translation)
}
}
}
}
您可以将所有内容包装到这样的函数中
func translate(_ phrase: String,to toLanguage: String,completion: @escaping (String?) -> ()) {
guard let textToTranslate = phrase.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed),let url = URL(string: "https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=" + toLanguage + "&dt=t&dt=t&q=" + textToTranslate) else {
completion(nil)
return
}
let task = URLSession.shared.dataTask(with: url) { data,response,error in
if let data = data {
var reply: [Any] = []
do {
reply = try JSONSerialization.jsonObject(with: data) as? [Any] ?? []
} catch {
print(error)
completion(nil)
}
if let next = reply.first as? [Any] {
if let next = next.first as? [Any] {
if let translation = next.first as? String {
completion(translation)
}
}
}
}
}
task.resume()
}
以闭包调用
translate("Hello there,I would love some help",to: "es",completion: {
if let reply = $0 {
print(reply)
} else {
print("Translation failed")
}
})