我正在开发一个iOS应用程序,可以从Open Trivia Database (API)中获取琐碎问题
在阅读了这些文档并反复使用之后,我认为最好的解决方案是使用base64编码(因为它似乎在Swift中得到了支持)。我已经成功地获取了数据,并使用JSONParser将其解析为结构。我必须解决的问题是如何将值从base64转换为UTF8。(键被正确读取,因此它映射到我的结构)
我的第一个想法是使用decoder.dataDecodingStrategy = .base64
,但这似乎根本没有任何效果。我也不知道为什么。
这是正确的方法吗,还是应该在字符串读入到structs之后自己解码?
简而言之,解析的结果是一个包含responseCode作为Int的结构和一个数组的结构,这些结构用我想转换为UTF8作为成员的字符串表示问题
我的解析代码如下所示:
let urlPath = "https://opentdb.com/api.php?amount=10&encode=base64"
let apiURL = URL(string: urlPath)!
URLSession.shared.dataTask(with: apiURL) { (data, response, error) in
guard let data = data else {return}
do{
let decoder = JSONDecoder()
decoder.dataDecodingStrategy = .base64
let questionData = try decoder.decode(Response.self, from: data)
print(questionData)
}catch let err{
print("Error", err)
}
}.resume()
最佳答案
Base64编码用于声明为数据而不是字符串的属性,如下所示:
struct Response: Codable {
let someBaseEncodedString: Data
var someString: String? {
get {
return String(data: someBaseEncodedString, encoding: .utf8)
}
}
}
因此,对于您给出的示例,作为base64编码字符串返回的所有属性都应该在结构中具有数据类型,然后再作为字符串解码。
关于json - 使用JSON-API提取的字符串将在Swift中从base64转换为UTF8,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53243404/