Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
9
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@satoshi-iwaki

[iOS][Swift 4] CodableでJSONのパース

Swift 4からCodableが追加されて、JSONのパースが簡単になった。

Encoding and Decoding Custom Types

以下のようなJSONをパースする場合
https://rss.itunes.apple.com/api/v1/us/apple-music/new-music/2/explicit.json
※URLはRSS Feed Generatorで生成

{
    "feed":{
        "title":"New Releases",
        "id":"https://rss.itunes.apple.com/api/v1/us/apple-music/new-music/2/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/new-music/2/explicit.json"},
            {"alternate":"https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewRoom?fcId=976405703"}
        ],
        "copyright":"Copyright © 2017 Apple Inc. All Rights Reserved.",
        "country":"us",
        "icon":"http://itunes.apple.com/favicon.ico",
        "updated":"2017-08-12T01:30:53.000-07:00",
        "results":[
            {
                "artistId":"991187319",
                "artistName":"Moneybagg Yo",
                "artistUrl":"https://itunes.apple.com/us/artist/moneybagg-yo/id991187319",
                "artworkUrl100":"http://is1.mzstatic.com/image/thumb/Music118/v4/28/25/c8/2825c846-e976-bd16-2fbf-f5bdf3334877/source/200x200bb.png",
                "copyright":"℗ 2017 N-Less Entertainment, LLC distributed by Interscope Records",
                "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"
                    }
                ],
                "id":"1267471554",
                "kind":"album",
                "name":"Federal 3X",
                "releaseDate":"2017-08-11",
                "url":"https://itunes.apple.com/us/album/federal-3x/id1267471554"
            },
            {
                "artistId":"334854763",
                "artistName":"Kesha",
                "artistUrl":"https://itunes.apple.com/us/artist/kesha/id334854763",
                "artworkUrl100":"http://is1.mzstatic.com/image/thumb/Music117/v4/06/19/3e/06193ee9-3caa-642c-901c-d0097470c50b/source/200x200bb.png",
                "copyright":"℗ 2017 Kemosabe Records",
                "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"
                    }
                ],
                "id":"1253656856",
                "kind":"album",
                "name":"Rainbow",
                "releaseDate":"2017-08-11",
                "url":"https://itunes.apple.com/us/album/rainbow/id1253656856"
            }
        ]
    }
}

Codableを使って、簡単にパースできる。

struct RssFeedResultGenre: Codable {
    let genreId: String
    let name: String
    let url: URL
}

struct RssFeedResult: Codable {
    let artistId: String
    let artistName: String
    let artistUrl: URL
    let artworkUrl100: URL
    let copyright: String
    let genres: [RssFeedResultGenre]
    let id: String
    let kind: String
    let name: String
    let releaseDate: String
    let url: URL
}

struct RssFeedAuthor: Codable {
    let name: String
    let uri: URL
}

struct RssFeed: Codable {
    let title: String
    let id: String
    let author: RssFeedAuthor
    let links: [Dictionary<String, String>]
    let copyright: String
    let country: String
    let icon: URL
    let updated: Date
    let results: [RssFeedResult]
}

struct Rss: Codable {
    let feed: RssFeed
}
let url = URL(string: "https://rss.itunes.apple.com/api/v1/us/apple-music/new-music/2/explicit.json")!

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"   // "2017-08-12T01:30:53.000-07:00"
let decoder: JSONDecoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)

do {
    let data = try Data(contentsOf: url, options: [])
    let rss = try decoder.decode(Rss.self, from: data)
    print(rss)
} catch {
    print(error)
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
9
Help us understand the problem. What are the problem?