首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift 4中解码JSON有问题

在Swift 4中解码JSON有问题
EN

Stack Overflow用户
提问于 2018-07-18 11:30:10
回答 1查看 141关注 0票数 0

以下是JSON的响应:

代码语言:javascript
复制
{
  "feed": {
    "title": "Top Albums",
    "id": "https://rss.itunes.apple.com/api/v1/us/apple-music/top-albums/all/25/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/top-albums/all/25/explicit.json"
      },
      {
        "alternate": "https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=34&popId=82&app=music"
      }
    ],
    "copyright": "Copyright © 2018 Apple Inc. All rights reserved.",
    "country": "us",
    "icon": "http://itunes.apple.com/favicon.ico",
    "updated": "2018-07-17T01:41:38.000-07:00",
    "results": [
      {
        "artistName": "Drake",
        "id": "1405365674",
        "releaseDate": "2018-06-29",
        "name": "Scorpion",
        "kind": "album",
        "copyright": "℗ 2018 Young Money/Cash Money Records",
        "artistId": "271256",
        "artistUrl": "https://itunes.apple.com/us/artist/drake/271256?app=music",
        "artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Music125/v4/5d/9b/97/5d9b97d6-9f78-e43b-7ba7-c2c42f53a166/00602567879121.rgb.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://itunes.apple.com/us/album/scorpion/1405365674?app=music"
      },
      ...

这是我尝试解码上述JSON的代码:

代码语言:javascript
复制
struct object: Decodable {
    struct feed: Decodable {
        let title: String?
        let id: Int?


        struct Author: Decodable {
            let name: String?
            let uri: String?
        }

        let author: Author?
        struct Link: Decodable {
            let url: String?
            private enum CodingKeys: String, CodingKey {
                case url = "self"
            }
        }
        let links: [Link]?
        let copyright: String?
        let country: String?
        let icon: String?
        let updated: String?

        let results: [Album]?
    }
}

struct Album: Decodable {
    let artistName: String?
    let id: Int?
    let releaseDate: String?
    let name: String?
    let artworkUrl100: String?
    let kind: String?
    let copyright: String?
    let artistId: Int?
    let artistUrl: String?
    struct Genre: Decodable {
        let genreId: Int?
        let name: String?
        let url: String?
    }
    let genres: [Genre]?
    let url: String?
}

我试图获得与专辑名称,艺术家姓名和图像网址的结果。我很难理解如何构造一个合适的结构来获得带有嵌套json的数据。

当我试图在我的完成块中获取数据时,我最终得到了所有东西的空值。

代码语言:javascript
复制
//Networking
let jsonString = "https://rss.itunes.apple.com/api/v1/us/apple-music/top-albums/all/25/explicit.json"

guard let url = URL(string: jsonString) else { return }

URLSession.shared.dataTask(with: url) { (data, response, error) in

    guard let data = data else { return }

    do {
        let obj = try JSONDecoder().decode(object.feed.self, from: data)
        print(obj)
    } catch let jsonError {
        print("Error with json", jsonError)
    }

}.resume()

我的结果是全部为零:

feed(title: nil, id: nil, author: nil, links: nil, copyright: nil, country: nil, icon: nil, updated: nil, results: nil)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-18 11:48:37

你有一些问题。

首先,最外层的结构是关键字feed下的对象

您需要:

代码语言:javascript
复制
struct object: Decodable {
    let feed: Feed
}

struct Feed: Decodable {
    let title: String
    let id: String

    let author: Author
    struct Link: Decodable {
        let url: String?
        private enum CodingKeys: String, CodingKey {
            case url = "self"
        }
    }
    let links: [Link]
    let copyright: String
    let country: String
    let icon: String
    let updated: String

    let results: [Album]
}

然后你可以通过以下方式进行解码:

代码语言:javascript
复制
do {
    let obj = try JSONDecoder().decode(object.self, from: data)
    print(obj)
} catch let jsonError {
    print("Error with json", jsonError)
}    

请注意,所有的“id”都是String,而不是Int

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51393162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档