【发布时间】:2018-06-19 20:13:04
【问题描述】:
通过 API 调用解析 JSON 后,我无法将解析的 JSON 转换为我想要在 ViewController 中显示的数据。我能够在控制台中打印 JSON 数据,但我不能只从我想要显示的数据中获取“word: ..”的值。这是 JSON 对象的示例:
{
"metadata": {},
"results": [
{
"id": "eurhythmic",
"word": "eurhythmic"
}
]
}
我使用的结构如下:
// Struct RandomWords
struct StoreRandomWords: Codable {
let results: [Result]
}
struct Result: Codable {
let word: String
}
从 API 获取数据的代码:
func fetchRandomWord(completion: @escaping (StoreRandomWords?) -> Void) {
let language = "en"
let filters = "registers%3DRare%3Bdomains%3DArt?"
let limit = "limit=1"
let url = URL(string: "https://od-api.oxforddictionaries.com:443/api/v1/wordlist/\(language)/\(filters)\(limit)")!
var request = URLRequest(url: url)
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue(appId, forHTTPHeaderField: "app_id")
request.addValue(appKey, forHTTPHeaderField: "app_key")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
do {
let jsonData = try JSONDecoder().decode(StoreRandomWords.self, from: data)
print(jsonData)
} catch {
print(error)
}
} else {
print(error)
print(NSString.init(data: data!, encoding: String.Encoding.utf8.rawValue)!)
}
}
task.resume()
}
以及我要在其中加载“单词”的 ViewController 中的代码:
// Do any additional setup after loading the view.
override func viewDidLoad() {
super.viewDidLoad()
// Fetch data for Daily Word.
ContextController.shared.fetchRandomWord( completion: { (storeRandomWord) in
if let storeRandomWord = storeRandomWord {
//
}
})
}
这在控制台中给了我这个输出:
StoreRandomWords(results: [GetContext.Result(word: "eurhythmic")])
我的目标是从字面上显示价值词,这里是“有节奏的”。
(我是初学者,不是以英语为母语的人,所以任何关于如何改进代码或问题的反馈都会有所帮助并欢迎。)
【问题讨论】:
-
jsonData.results.first?.word或者如果您实际上通过附件返回了结果storeRandomWord.results.first?.word -
第一个对我有用,第二个不行。当我将控制台放入机箱时,控制台什么也没打印,试图打印一个“hello,world”,但即使这样也没有输出任何东西。
-
嗯,根据您的代码,我没有看到您正在调用完成处理程序的任何地方
-
哇,我不敢相信我错过了。非常感谢!节省了我很多时间。