【问题标题】:Swift 4 get song for every channelSwift 4 为每个频道获取歌曲
【发布时间】:2018-08-23 12:30:45
【问题描述】:

当我尝试为每个频道获取上一个和现在正在播放的歌曲时,我遇到了同样的错误。我认为我的 struct Root 和播放列表有问题,因为数据格式不正确。我正在使用 Swift 4 并尝试学习 JSON,但这很难。以前的结构与 Song 结构相同。如何解决我的错误?

我的代码现在看起来:

  import UIKit

    struct Root : Decodable {
        let copyright : String
        let channels : [Channel]
        let pagination : Pagination



    }

    struct Channel : Decodable {
        let image : String
        let imagetemplate : String
        let color : String
        let tagline : String?
        let siteurl : String
        let id : Int
        let url : URL?
        let statkey : String?
        let scheduleurl : String
        let channeltype : String
        let name : String
    }

    struct Pagination : Decodable {
        let page, size, totalhits, totalpages : Int
        let nextpage : URL
    }

    struct  Playlist : Decodable{
        let id : Int
        let name :String
        let prev : [previoussong]
        let song : [Song]
    }
    struct previoussong : Decodable  {
        let  title : String
        let description : String
        let artist : String
        let composer :String
        let conductor : String
        let albumname : String
        let recordlabel : String
        let lyricist : String
        let producer : String
        let starttimeutc : String
        let stopttimeutc : String

    }
    struct Song : Decodable  {
        let  title : String
        let description : String
        let artist : String
        let composer :String
        let conductor : String
        let albumname : String
        let recordlabel : String
        let lyricist : String
        let producer : String
        let starttimeutc : String
        let stopttimeutc : String

    }
    import UIKit

    class ViewController: UIViewController,UITableViewDataSource {
        var auth = SPTAuth.defaultInstance()!
        var session:SPTSession!
        var loginUrl: URL?
    var tests = [Channel]()
    //var pl = [Playlist]()
        var stationsName:String?

        @IBOutlet weak var tableV: UITableView!
        @IBOutlet weak var image: UIImageView!
        @IBOutlet weak var statLabel: UILabel!
        @IBOutlet weak var songLabel: UILabel!

        override func viewDidLoad() {
            super.viewDidLoad()
            tableV.dataSource = self

            downloadStations()




        }
        func downloadStations(){
            let test2 = "http://api.sr.se/api/v2/channels?format=json"
            let play = "http://api.sr.se/api/v2/playlists/rightnow?format=json"

            let url = URL(string: test2)
            URLSession.shared.dataTask(with: url!){ (data , response, error) in
               do{
                let root = try JSONDecoder().decode(Root.self, from: data!)
                self.tests = root.channels
                for eachStations in self.tests {
                    self.stationsName = eachStations.name
                    print(" " + self.stationsName!)
                    DispatchQueue.main.async {

                        self.tableV.reloadData()
                    }
    }
    }
               catch{
        print(error.localizedDescription)

    }

            }.resume()



        }

      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tests.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style : .default, reuseIdentifier : nil)
        cell.textLabel?.text = tests[indexPath.row].name
        return cell
    }




        override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

     }  

【问题讨论】:

标签: json swift radio


【解决方案1】:

您从api.sr.se/api/v2/playlists/rightnow?format=json 获得的数据并不总是具有正确的结构。请注意,有时您会得到以 copyright 字段开头的 json,而有时您会得到如下内容:

{
    "playlist": {
        "previoussong": {
            "title": "Stir Fry",
            "description": "Migos - Stir Fry",
            "artist": "Migos",
            "composer": "Quavious Marshall/Pharrell Williams",
            "recordlabel": "Universal",
            "starttimeutc": "\/Date(1521137326000)\/",
            "stoptimeutc": "\/Date(1521137510000)\/"
        },
...

当您尝试解码为 Root 时,解码器会在 json 中查找类似于您的 Root 类的内容,如下所示:

{
    "copyright": "Copyright Sveriges Radio 2018. All rights reserved.",
    "channels": [{
        "id": 4540,
        "name": "Ekot",
        "playlists": {
            "playlist": {
                "channel": {
                    "id": 4540,
                    "name": "Ekot sänder direkt"
                }

如果在 json 中找不到类似的内容,则表示数据丢失。您必须找到一种方法来判断何时解码为Root,以及何时数据不适合Root

【讨论】:

  • 这是非常好的信息,如果正确的话,但是说“你必须弄清楚......”可能会使这不是一个实际的答案。您可能会扩展您的解释以显示 如何 尝试解码为 Root 以及如何在失败时以良好的顺序检测该失败并尝试解码为其他结构。
  • 我们不同。我已经回答了他的问题,如何解决我的错误? 让我自己满意。他的错误是认为数据是一致的。我坚信帮助陷入困境的人。我不太相信你的建议。他显然缺乏经验。给他一个sn-p代码对他来说是一种伤害;他将从自己解决这个问题的经验中受益更多。如果您有不同的感觉,请随意“帮助”他。这不关我的事。
  • :) 我不打算进一步参与;他甚至没有显示他的 JSON,所以我认为整个问题无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
相关资源
最近更新 更多