URL에서 검색하는 큰 JSON 문자열을 구문 분석하려고합니다. 나는 시험에 사용하고있는 JSON은 다음과 같습니다 : 다음과 같이 정보를 인쇄하고Swift에서 Decodable 및 CodingKeys를 사용하여 JSON 구문 분석 4
struct Genre: Decodable {
let name: String
}
struct Book: Decodable {
let author: String
let artworkURL: URL
let genres: [Genre]
let name: String
let releaseDate: String
}
struct BookCollection {
let title: String
let books: [Book]
enum CodingKeys: String, CodingKey {
case feed
}
enum FeedKeys: String, CodingKey {
case title, results
}
enum ResultKeys: String, CodingKey {
case author, artworkURL, genres, name, releaseDate
}
enum GenreKeys: String, CodingKey {
case name
}
}
extension BookCollection: Decodable {
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let feed = try values.nestedContainer(keyedBy: FeedKeys.self,
forKey: .feed)
self.title = try feed.decode(String.self, forKey: .title)
self.books = try feed.decode([Track].self, forKey: .results)
}
}
:
do {
let response = try JSONDecoder().decode(BookCollection.self, from: json)
for book in response.books {
print(book.genres)
}
} catch {
print(error)
}
let json = """
{
"feed": {
"title": "Harry Potter",
"test": "I dont want this value",
"results": [
{
"author": "JK Rowling",
"artworkURL": "A url",
"genres": [
{
"name": "Fantasy"
},
{
"name": "Scifi"
}
],
"name": "Goblet of Fire",
"releaseDate": "2000-07-08"
},
{
"author": "JK Rowling",
"artworkURL": "A url",
"genres": [
{
"name": "Fantasy"
},
{
"name": "Scifi"
}
],
"name": "Half Blood Prince",
"releaseDate": "2009-07-15"
}
]
}
}
""".data(using: .utf8)!
내가에 데이터를 배치 할 몇 가지 데이터 구조체를
장르 이외의 모든 정보를 인쇄하는 데 성공했습니다. 이것은 장르 배열을 제공하지만, 액세스 할 수없는 book.genres.name
이름에 액세스 할 수 없습니다. 나는 사용해야한다 : book.genres[0]
그리고 저에게 다만 첫번째 색인을위한 결과를 준다.
내 BookCollection
확장에 내 JSON 디코딩을 완벽하게 할 수있는 방법이 있습니까? book.genres.name
을 사용 하시겠습니까? 당신이 정말로 여분의 name
재산, 당신은 새로운 확장에 그렇게 할 수있는 필요한 경우
당신에게
'book.genres.name'이 반환해야하는 값은 무엇입니까? –
@PauloMattos 각 책에 대한 배열을 반환해야합니다. 첫 번째 책은'판타지'와'사이 피'가 될 것입니다. –
@DominicPilla 당신이 당신의 책 구조체'확장 책을 읽기 전용 계산 된 속성을 추가 할 수 있습니다 { var에 allGenres : [문자열] { 반환 genres.map {$ 0.name} } }'와 사용'인쇄 (book.allGenres)' –