Как получить доступ к вложенным значениям массива 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 для запуска. Я не уверен, что я делаю неправильно.

0 ответов

Другие вопросы по тегам