Как получить доступ к вложенным значениям массива JSON с помощью Gloss?
В настоящее время я использую библиотеку Gloss: https://github.com/hkellaway/Gloss
для того, чтобы помочь разобрать данные JSON. Кажется, я не могу получить доступ к вложенным массивам, таким как значение "know_for":
"results": [
{
"profile_path": "/s2eX7lG0n35AtkenfZV0uoLSudv.jpg",
"adult": false,
"id": 77700,
"known_for": [
{
"poster_path": "/ckrTPz6FZ35L5ybjqvkLWzzSLO7.jpg",
"adult": false,
"overview": "",
"release_date": "2016-05-25",
"original_title": "Warcraft",
"genre_ids": [
12,
14,
28
]
}
]
}
]
Вот как я настраиваю свои объекты данных:
public struct ResultsPeopleData: Decodable {
public let results: [PeopleData]?
public init?(json: JSON) {
results = "results" <~~ json
}
}
public struct knownForArray : Decodable {
public let poster : String
public let overview : String
public let releaseDate : String
public let title : String
public let id : NSNumber
public let backdrop : String
public init?(json: JSON) {
guard let poster : String = "poster_path" <~~ json,
let overview : String = "overview" <~~ json ?? "N/A",
let releaseDate : String = "release_date" <~~ json ?? "N/A",
let title : String = "title" <~~ json ?? "N/A",
let id : NSNumber = "id" <~~ json,
let backdrop : String = "backdrop_path" <~~ json
else { return nil }
self.poster = poster
self.overview = overview
self.releaseDate = releaseDate
self.title = title
self.id = id
self.backdrop = backdrop
}
}
public struct PeopleData: Decodable {
public let profile : String
public let id : NSNumber
public let knownFor : [knownForArray]?
public let name : String
public init? (json: JSON) {
guard let profile : String = "profile_path" <~~ json ?? "N/A",
let id : NSNumber = "id" <~~ json,
let knownFor : knownForArray = "known_for" <~~ json,// This causes function to return
let name : String = "name" <~~ json
else { return nil }
self.profile = profile
self.id = id
self.knownFor = [knownFor]
self.name = name
}
Вот как я обновляю объекты данных:
static func updateAllData(urlExtension: String, completionHandler:@escaping (_ details: [PeopleData]?) -> Void){
let nm = NetworkManager.sharedManager
nm.getJSONData(type:"person", urlExtension: urlExtension, completion: {
data in
if let jsonDictionary = nm.parseJSONData(data)
{
guard let peopleResults = ResultsPeopleData(json: jsonDictionary)
else {
print("Error initializing object")
return
}
print(jsonDictionary)
guard let peopleData = peopleResults.results
else {
print("No such item") //This gets triggered when updating "knownfor" value
return
}
completionHandler(peopleData)
}
})
}
}
Я помещаю точки останова в inits для значений объекта и каждый раз, когда пытаюсь и инициализирую PeopleData `
Публичная пусть известна для: [knownForArray]
значение прекращает инициализацию структуры PeopleData и вызывает
печать ("Нет такого предмета")
часть функции updateAllData для запуска. Я не уверен, что я делаю неправильно.