1

I am using Swift 5.1 and I have a deeply nested json file and I am just interested in accessing a few elements within the json file and ignore the rest of the data. For instance, I just want "artistName" and "releaseDate" values from the array in json string below. If I use nested decodable structs I don't want to need to declare every single key name just to get an array of those two values.


{"feed":{"title":"Coming Soon","id":"https://rss.itunes.apple.com/api/v1/us/apple-music/coming-soon/all/10/explicit.json","author":{"name":"iTunes Store","uri":"http://wwww.apple.com/us/itunes/"},"links":[{"self":"https://rss.itunes.apple.com/api/v1/us/apple-music/coming-soon/all/10/explicit.json"},{"alternate":"https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewRoom?fcId=1396220241\u0026app=music"}],"copyright":"Copyright © 2018 Apple Inc. All rights reserved.","country":"us","icon":"http://itunes.apple.com/favicon.ico","updated":"2019-12-04T01:48:22.000-08:00",

    "results":[{"artistName":"Stormzy","id":"1487951013","releaseDate":"2019-12-13","name":"Heavy Is The Head","kind":"album","copyright":"℗ 2019 Hashtag Merky Music Limited under exclusive license to Atlantic Records UK, a division of Warner Music UK Limited.","artistId":"394865154","contentAdvisoryRating":"Explicit","artistUrl":"https://music.apple.com/us/artist/stormzy/394865154?app=music","artworkUrl100":"https://is5-ssl.mzstatic.com/image/thumb/Music123/v4/3c/a8/7c/3ca87c13-bffa-3ebd-eec6-68ea78ab556d/190295403003.jpg/200x200bb.png","genres":[{"genreId":"18","name":"Hip-Hop/Rap","url":"https://itunes.apple.com/us/genre/id18"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/heavy-is-the-head/1487951013?app=music"},{"artistName":"Camila Cabello","id":"1487577356","releaseDate":"2019-12-06","name":"Romance","kind":"album","copyright":"℗ 2019 Simco Ltd. under exclusive license to Epic Records, a division of Sony Music Entertainment","artistId":"935727853","contentAdvisoryRating":"Explicit","artistUrl":"https://music.apple.com/us/artist/camila-cabello/935727853?app=music","artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music113/v4/fa/89/c7/fa89c706-fecc-2ece-cfc2-661c42807fbd/886448121220.jpg/200x200bb.png","genres":[{"genreId":"14","name":"Pop","url":"https://itunes.apple.com/us/genre/id14"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/romance/1487577356?app=music"},{"artistName":"Harry Styles","id":"1485802965","releaseDate":"2019-12-13","name":"Fine Line","kind":"album","copyright":"℗ 2019 Erskine Records Limited, under exclusive license to Columbia Records, a Division of Sony Music Entertainment","artistId":"471260289","artistUrl":"https://music.apple.com/us/artist/harry-styles/471260289?app=music","artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music113/v4/72/89/85/728985d1-9484-7b71-1ea8-0f0654f7dc16/886448022213.jpg/200x200bb.png","genres":[{"genreId":"14","name":"Pop","url":"https://itunes.apple.com/us/genre/id14"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/fine-line/1485802965?app=music"},{"artistName":"Grimes","id":"1487294744","releaseDate":"2020-02-21","name":"Miss Anthropocene","kind":"album","copyright":"℗ 2020 4AD Ltd","artistId":"2756920","contentAdvisoryRating":"Explicit","artistUrl":"https://music.apple.com/us/artist/grimes/2756920?app=music","artworkUrl100":"https://is3-ssl.mzstatic.com/image/thumb/Music113/v4/a9/ff/a4/a9ffa497-a6d4-d21a-811b-c88bd0a18de8/dj.pkknchvn.jpg/200x200bb.png","genres":[{"genreId":"7","name":"Electronic","url":"https://itunes.apple.com/us/genre/id7"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/miss-anthropocene/1487294744?app=music"},{"artistName":"Kesha","id":"1484385866","releaseDate":"2020-01-10","name":"High Road","kind":"album","copyright":"℗ 2019 Kemosabe Records","artistId":"334854763","contentAdvisoryRating":"Explicit","artistUrl":"https://music.apple.com/us/artist/kesha/334854763?app=music","artworkUrl100":"https://is3-ssl.mzstatic.com/image/thumb/Music113/v4/52/0a/df/520adf4c-36e7-5d7d-114d-c5682df53b98/886447918104.jpg/200x200bb.png","genres":[{"genreId":"14","name":"Pop","url":"https://itunes.apple.com/us/genre/id14"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/high-road/1484385866?app=music"},{"artistName":"Tame Impala","id":"1484742845","releaseDate":"2020-02-14","name":"The Slow Rush","kind":"album","copyright":"An Island Records Australia release; ℗ 2019 Modular Recordings Pty Ltd","artistId":"290242959","artistUrl":"https://music.apple.com/us/artist/tame-impala/290242959?app=music","artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music123/v4/a3/d2/fc/a3d2fc93-8911-6f99-854a-8b2a107450d6/19UMGIM96748.rgb.jpg/200x200bb.png","genres":[{"genreId":"20","name":"Alternative","url":"https://itunes.apple.com/us/genre/id20"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/the-slow-rush/1484742845?app=music"},{"artistName":"Five Finger Death Punch","id":"1487244856","releaseDate":"2020-02-28","name":"F8","kind":"album","copyright":"℗ 2020 Five Finger Death Punch, under exclusive license to Better Noise Music","artistId":"258875116","contentAdvisoryRating":"Explicit","artistUrl":"https://music.apple.com/us/artist/five-finger-death-punch/258875116?app=music","artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music113/v4/34/86/e7/3486e71f-6a83-79ae-e44e-7d1a8ed3694f/849320060208.png/200x200bb.png","genres":[{"genreId":"1153","name":"Metal","url":"https://itunes.apple.com/us/genre/id1153"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"},{"genreId":"21","name":"Rock","url":"https://itunes.apple.com/us/genre/id21"}],"url":"https://music.apple.com/us/album/f8/1487244856?app=music"},{"artistName":"Dio","id":"1485638854","releaseDate":"2004-09-07","name":"Master of the Moon (Deluxe Edition) [2019 - Remaster]","kind":"album","copyright":"℗ 2019 Niji Entertainment Group under exclusive license to BMG Rights Management (US) LLC","artistId":"2779392","artistUrl":"https://music.apple.com/us/artist/dio/2779392?app=music","artworkUrl100":"https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/ac/1c/71/ac1c719d-b014-a870-267b-1c25c7300a99/4050538544442.jpg/200x200bb.png","genres":[{"genreId":"21","name":"Rock","url":"https://itunes.apple.com/us/genre/id21"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/master-of-the-moon-deluxe-edition-2019-remaster/1485638854?app=music"},{"artistName":"Lauv","id":"1480846311","releaseDate":"2020-03-06","name":"~how i'm feeling~","kind":"album","copyright":"℗ 2020 Lauv under exclusive license to AWAL Recordings America, Inc.","artistId":"982612996","contentAdvisoryRating":"Explicit","artistUrl":"https://music.apple.com/us/artist/lauv/982612996?app=music","artworkUrl100":"https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/1f/ef/9b/1fef9b0b-ef42-ecc2-3ba5-33dbfa0927fb/5056167113867_1.jpg/200x200bb.png","genres":[{"genreId":"14","name":"Pop","url":"https://itunes.apple.com/us/genre/id14"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/how-im-feeling/1480846311?app=music"},{"artistName":"Sepultura","id":"1485593522","releaseDate":"2020-02-07","name":"Quadra","kind":"album","copyright":"℗ 2020 Nuclear Blast","artistId":"918092","artistUrl":"https://music.apple.com/us/artist/sepultura/918092?app=music","artworkUrl100":"https://is3-ssl.mzstatic.com/image/thumb/Music123/v4/08/70/ab/0870abad-d062-4819-e5dd-9e33c6836966/cover.jpg/200x200bb.png","genres":[{"genreId":"1153","name":"Metal","url":"https://itunes.apple.com/us/genre/id1153"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"},{"genreId":"21","name":"Rock","url":"https://itunes.apple.com/us/genre/id21"}],"url":"https://music.apple.com/us/album/quadra/1485593522?app=music"}]}}

2
  • 3
    Considering you can use sites like app.quicktype.io to generate the swift code structure for your json message I would argue that using Codable is the best and easiest way to do it. Commented Dec 5, 2019 at 19:07
  • Given speed and memory of current phones seems to me a waste of time trying to get fancy. But if determined, write a simple parser that detects depth, and then only decode what you find there. Commented Dec 5, 2019 at 19:09

1 Answer 1

5

As Joakim suggests in the comments, the easiest approach is to throw this at https://app.quicktype.io and then delete what you don't care about. That leaves:

struct Welcome: Codable {
    let feed: Feed
}

struct Feed: Codable {
    let results: [Result]
}

struct Result: Codable {
    let artistName, releaseDate: String
}

let results = try JSONDecoder().decode(Welcome.self, from: jsonData).feed.results

If you want it to be a bit simpler to use, you can merge Welcome and Feed like this:

struct Feed: Codable {
    let results: [Result]

    enum FeedKeys: CodingKey { case feed }
    enum ResultsKeys: CodingKey { case results }

    init(from decoder: Decoder) throws {
        let feed = try decoder.container(keyedBy: FeedKeys.self)
        let results = try feed.nestedContainer(keyedBy: ResultsKeys.self, forKey: .feed)
        self.results = try results.decode([Result].self, forKey: .results)
    }
}

let results = try JSONDecoder().decode(Feed.self, from: jsonData).results
Sign up to request clarification or add additional context in comments.

2 Comments

Putting your second answer into a playground, it complains that Feed does not conform to Codable and when changed to Decodable, it complains let results: [Result] Reference to generic type 'Result' requires arguments in <...>
@e987 You need to use the Result struct from the first part of the answer. Note that Result is a built-in type in Swift, hence the somewhat cryptic error message, so it is better to rename that struct to something else

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.