ios - 使用 iOS 和 Swift 访问深度嵌套的 json 数据的最简单方法是什么?

标签 ios json swift codable decodable

我使用的是 Swift 5.1,我有一个深度嵌套的 json 文件,我只想访问 json 文件中的几个元素,而忽略其余数据。例如,我只想从下面的 json 字符串中的数组中获取“artistName”和“releaseDate”值。如果我使用嵌套的可解码结构,我不想为了获取这两个值的数组而需要声明每个键名。


{"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"}]}}

最佳答案

正如 Joakim 在评论中建议的那样,最简单的方法是将其扔到 https://app.quicktype.io。然后删除你不关心的。剩下的是:

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

如果你想让它使用起来更简单一些,你可以像这样合并 Welcome 和 Feed:

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

关于ios - 使用 iOS 和 Swift 访问深度嵌套的 json 数据的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59201723/

相关文章:

ios - 请求 ALAssetRepresentation 的 size 属性时代码卡住

c# - 如何在 C# 中将 JSON 类型对象的值打印到控制台

flash - AS3 JSON解析

json - 在 Jersey 2.2 JAX-RS 下使用 JAXB 和 JSON 的命名空间

ios - 如何将文本字段的内容转换为 Xcode 11 (swift) 中的变量?

ios - 使用 AVAudioEngine 点击音频输出

ios - 我想暂停数组中的图像

ios - 从 url 到 ImageView 显示 Facebook 用户个人资料图像

ios - CloudKit 上传速度很慢

ios - swift 2.2 和 xcode 7.3 中的模拟和文档