json - 在 Swift 中从 JSON 中获取第一个元素(谷歌翻译)
问题描述
我无法从谷歌翻译生成的 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,null,3,null,null,[[]\n]\n,[[[\"88050b4eeda80a4gb03h2aa140d8a487\",\"en_es_2020q2.md\"]\n]\n]\n]\n]\n,null,\"en\",null,null,null,null,[]\n]\n")
我想将“Hola,me encantaría un 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")
}
})
推荐阅读
- powerbi - 如何在应用百分比增加之前创建一个四舍五入先前结果的列?
- c# - 关于在 Blazor 中使用 ValueTask 的 CA2012 警告。如何在 Blazor 中正确实现“一劳永逸”?
- php - Laravel 8. 我可以为一个请求按日期获取一系列商店收入吗?
- angular - 将 Angular 编译器导入 Bit 会导致依赖树问题
- browser - 如何使用代码获取 indexedDb 对象的路径
- node.js - Does Express access an app.get(/:params) if the user didn't type anything in the URL
- arrays - 对象的值在 React 状态下不会立即更新,任何人都可以解决这个问题吗?
- python - 检查二叉树是否围绕其中心对称-如何将节点值打印为调试?
- c# - 使用通用响应模型找不到路由异常
- django - cpanel是否需要外部命令才能运行redis