JSON массив внутри массива - PullRequest
       2

JSON массив внутри массива

0 голосов
/ 12 октября 2018

Я ищу доступ к строке, которая находится внутри массива JSON, который находится внутри другого массива.Я получаю доступ к JSON API с помощью JSONDecoder.Я получаю ошибки при попытке использовать различные методы, которые я использовал в прошлом при использовании массивов 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.

Какой правильный способ используется для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Довольно просто, результат filter - это массив, а 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)
    }
}

Назовите ваши имена членов структуры lowerCamelCased путем сопоставленияключи с CodingKeys или стратегией convertFromSnakeCase.

Если имеется только один элемент US, используйте first

if let us = self.country.first({ $0.iso_3166_1.contains("US") }) {
    for releaseDate in us.release_dates {
       print(releaseDate.certification)
    }
}
0 голосов
/ 12 октября 2018

us - это массив Results.

Чтобы получить первую сертификацию, используйте:

print(us.first!.release_dates.first!. certification)

Для краткости я принудительно разворачиваюсь, вы должны правильно сделать это снеобязательная привязка или охранное заявление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...