首页 > 解决方案 > 在 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”存储为字符串,任何指导都将不胜感激!先感谢您。

标签: jsonswiftgoogle-translate

解决方案


这是一个有效的丑陋解决方案,将闭包的内容替换为

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")
    }
})

推荐阅读