我正在寻找访问位于另一个数组内的JSON数组内的字符串。我正在使用JSONDecoder访问JSON API。使用JSON数组尝试使用过去使用的各种方法时,我收到错误消息。
这是代码:
var country = [Results]()
struct Rating: Codable {
let results: [Results]
}
struct Results: Codable {
let iso_3166_1: String
let release_dates: [Release_Dates]
}
struct Release_Dates: Codable {
let certification: String
}
func loadRating() {
let id = filmId
let apiKey = ""
let url = URL(string: "https://api.themoviedb.org/3/movie/\(id)/release_dates?api_key=\(apiKey)")
let request = URLRequest(
url: url! as URL,
cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData,
timeoutInterval: 10 )
let session = URLSession (
configuration: URLSessionConfiguration.default,
delegate: nil,
delegateQueue: OperationQueue.main
)
let task = session.dataTask(with: request, completionHandler: { (dataOrNil, response, error) in
if let data = dataOrNil {
do { let rates = try! JSONDecoder().decode(Rating.self, from: data)
self.country = rates.results
let us = self.country.filter({ $0.iso_3166_1.contains("US") })
print(us)
}
}
})
task.resume()
}
us
打印到控制台
[Film.DetailsView.Results(iso_3166_1: "US", release_dates: [Film.DetailsView.Release_Dates(certification: "PG-13")])]
我正在尝试访问certification
字符串。
实现此目标的正确方法是什么?
答案 0 :(得分:1)
us
是Results
的数组。
要获得第一个认证,请使用此:
print(us.first!.release_dates.first!. certification)
为简便起见,我被迫解开包装,您应该使用可选的装订或保护声明正确地进行包装。
答案 1 :(得分:1)
非常简单,certification
的结果是一个数组,release_dates
的结果在数组let us = self.country.filter({ $0.iso_3166_1.contains("US") })
for item in us {
for releaseDate in item.release_dates {
print(releaseDate.certification)
}
}
CodingKeys
请通过使用convertFromSnakeCase
或US
策略映射键来命名结构成员名称 lowerCamelCased 。
如果只有一项first
,请使用if let us = self.country.first({ $0.iso_3166_1.contains("US") }) {
for releaseDate in us.release_dates {
print(releaseDate.certification)
}
}
logging.Filter