【问题标题】:Why is my json response not conforming to my struct?为什么我的 json 响应不符合我的结构?
【发布时间】:2020-03-06 16:24:19
【问题描述】:

我已经制作了一个简单的 api 来测试 apiary,我已经为响应创建了一个结构。但是当进行调用并且由于某种原因我试图使其符合我的结构时,我没有得到正文而只得到标题。我想得到小联盟球队并将它们放入这个结构中,然后打印出来。

API 链接: https://littleleaguers.docs.apiary.io/#reference/0/little-league-teams/list-all-little-league-teams

响应正文:

 {
    "name": "Little League Teams"
    "teams": [
        {
            "id": 1,
            "team": "Yankees",
            "players": [
                {
                    "id": 1,
                    "position": 1,
                    "player": null
                },
                {
                    "id": 2,
                    "position": 2,
                    "player": {
                        "name": "John",
                        "last": "Johnson",
                        "jersey": 5
                        "signed_up": "2018-07-16T08:40:51.620Z"
                    }
                },
                {
                    "id": 3,
                    "position": 3,
                    "player": null
                },
                {
                    "id": 4,
                    "position": 4,
                    "player": null
                },
                {
                    "id": 5,
                    "position": 5,
                    "player": {
                        "name": "Blake",
                        "last": "Smith",
                        "jersey": 28
                        "signed_up": "2018-07-14T18:23:23.000Z"
                    }
                },
                {
                    "id": 6,
                    "position": 6,
                    "player": null
                },
                {
                    "id": 7,
                    "position": 7,
                    "player": null
                },
                {
                    "id": 8,
                    "position": 8,
                    "player": null
                },
                {
                    "id": 9,
                    "position": 9,
                    "player": null
                },
                {
                    "id": 10,
                    "position": 10,
                    "player": null
                },
                {
                    "id": 11,
                    "position": 11,
                    "player": null
                },
                {
                    "id": 12,
                    "position": 12,
                    "player": null
                }
            ]
        },
        {
            "id": 2,
            "team": "Red Sox",
            "players": [
                {
                    "id": 13,
                    "position": 1,
                    "player": null
                },
                {
                    "id": 14,
                    "position": 2,
                    "player": null
                },
                {
                    "id": 15,
                    "position": 3,
                    "player": null
                },
                {
                    "id": 16,
                    "position": 4,
                    "player": null
                },
                {
                    "id": 17,
                    "position": 5,
                    "player": null
                },
                {
                    "id": 18,
                    "position": 6,
                    "player": null
                },
                {
                    "id": 19,
                    "position": 7,
                    "player": null
                }
            ]
        }
    ]
}

League.swift:

struct League: Decodable {
var name: String
var  teams: [Teams]

}

团队.swift:

    struct Team: Decodable {
var id: Int
var team: String
var players: [Players]

}

Players.swift:

 struct Players: Decodable {

var id: Int
var position: Int
var player: player?

}

    struct player: Decodable {

var name: String
var last: String
var jersey: Int
var signed_up: String

}

然后我有一个类来检索这些数据:

GetData.swift:

    class GetData{
    func getLeague(){
        let url = URL(string: "https://private-4df2e8-littleleaguers.apiary-mock.com/league")!
        let request = URLRequest(url: url)

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
      if let response = response {
        print("RESPONSE \(response)")

       /* if let data = data, let body = String(data: data, encoding: .utf8) {
          print("BODY \(body)")
          // this line prints the body
        }*/
        if let data = data, let dataObtained = try? JSONDecoder().decode(League.self, from: data){

            print("DATA \(dataObtained).....")// this line does not print 
        }
      } else {
        print(error ?? "Unknown error")
      }
    }

    task.resume()
    }

 }

然后我通过以下方式在 ViewController.swift 中调用它:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    let getData = GetData()
    getData.getLeague()
}

在控制台中打印的唯一内容是:

 RESPONSE <NSHTTPURLResponse: 0x6000008e5e80> { URL: https://private-4df2e8-littleleaguers.apiary-mock.com/league } { Status Code: 200, Headers {
    "Access-Control-Allow-Origin" =     (
        "*"
    );
    "Content-Encoding" =     (
        gzip
    );
    "Content-Length" =     (
        427
    );
    "Content-Type" =     (
        "application/json"
    );
    Date =     (
        "Fri, 06 Mar 2020 13:35:40 GMT"
    );
    Vary =     (
        "Accept-Encoding"
    );
    "access-control-allow-methods" =     (
        "OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT"
    );
    "access-control-max-age" =     (
        10
    );
    "x-apiary-ratelimit-limit" =     (
        120
    );
    "x-apiary-ratelimit-remaining" =     (
        119
    );
    "x-apiary-transaction-id" =     (
        5e6251ac6b105b008135d67a
    );
} }

【问题讨论】:

  • 不要try?,去掉问号和catch Decoding 错误。
  • 您的 JSON 无效,某些值后面缺少逗号

标签: ios json swift apiary.io


【解决方案1】:

修复一些返回的 JSON,这是错误的,你的结构模型中的一切都很好,请在 online swift playground 上查看:

import Foundation

let json = """
 {
    "name": "Little League Teams",
    "teams": [
        {
            "id": 1,
            "team": "Yankees",
            "players": [
                {
                    "id": 1,
                    "position": 1,
                    "player": null
                },
                {
                    "id": 2,
                    "position": 2,
                    "player": {
                        "name": "John",
                        "last": "Johnson",
                        "jersey": 5,
                        "signed_up": "2018-07-16T08:40:51.620Z"
                    }
                },
                {
                    "id": 3,
                    "position": 3,
                    "player": null
                },
                {
                    "id": 4,
                    "position": 4,
                    "player": null
                },
                {
                    "id": 5,
                    "position": 5,
                    "player": {
                        "name": "Blake",
                        "last": "Smith",
                        "jersey": 28,
                        "signed_up": "2018-07-14T18:23:23.000Z"
                    }
                },
                {
                    "id": 6,
                    "position": 6,
                    "player": null
                },
                {
                    "id": 7,
                    "position": 7,
                    "player": null
                },
                {
                    "id": 8,
                    "position": 8,
                    "player": null
                },
                {
                    "id": 9,
                    "position": 9,
                    "player": null
                },
                {
                    "id": 10,
                    "position": 10,
                    "player": null
                },
                {
                    "id": 11,
                    "position": 11,
                    "player": null
                },
                {
                    "id": 12,
                    "position": 12,
                    "player": null
                }
            ]
        },
        {
            "id": 2,
            "team": "Red Sox",
            "players": [
                {
                    "id": 13,
                    "position": 1,
                    "player": null
                },
                {
                    "id": 14,
                    "position": 2,
                    "player": null
                },
                {
                    "id": 15,
                    "position": 3,
                    "player": null
                },
                {
                    "id": 16,
                    "position": 4,
                    "player": null
                },
                {
                    "id": 17,
                    "position": 5,
                    "player": null
                },
                {
                    "id": 18,
                    "position": 6,
                    "player": null
                },
                {
                    "id": 19,
                    "position": 7,
                    "player": null
                }
            ]
        }
    ]
}
""".data(using: .utf8)!

struct player: Decodable {
    var name: String
    var last: String
    var jersey: Int
    var signed_up: String
}

struct Players: Decodable {
    var id: Int
    var position: Int
    var player: player?
}

struct Team: Decodable {
    var id: Int
    var team: String
    var players: [Players]
}

struct League: Decodable {
    var name: String
    var teams: [Team]
}


if let results = try? JSONDecoder().decode(League.self, from: json) {
    print(results)
}

输出:

联赛(名称:“小联盟球队”,球队:[SwiftPlayground.Team(id: 1、球队:“洋基队”,球员:[SwiftPlayground.Players(id: 1, position: 1,播放器:无),SwiftPlayground.Players(id:2,位置:2,播放器: 可选(SwiftPlayground.player(名称:“John”,最后:“Johnson”,球衣: 5、signed_up:“2018-07-16T08:40:51.620Z”))), SwiftPlayground.Players(id: 3, position: 3, player: nil), SwiftPlayground.Players(id: 4, position: 4, player: nil), SwiftPlayground.Players(id: 5, position: 5, player: 可选(SwiftPlayground.player(名称:“布莱克”,最后:“史密斯”,球衣: 28,已签名:“2018-07-14T18:23:23.000Z”))), SwiftPlayground.Players(id: 6, position: 6, player: nil), SwiftPlayground.Players(id: 7, position: 7, player: nil), SwiftPlayground.Players(id: 8, position: 8, player: nil), SwiftPlayground.Players(id: 9, position: 9, player: nil), SwiftPlayground.Players(id: 10, position: 10, player: nil), SwiftPlayground.Players(id: 11, position: 11, player: nil), SwiftPlayground.Players(id: 12, position: 12, player: nil)]), SwiftPlayground.Team(id: 2, team: "Red Sox", player: [SwiftPlayground.Players(id: 13, position: 1, player: nil), SwiftPlayground.Players(id: 14, position: 2, player: nil), SwiftPlayground.Players(id: 15, position: 3, player: nil), SwiftPlayground.Players(id: 16, position: 4, player: nil), SwiftPlayground.Players(id: 17, position: 5, player: nil), SwiftPlayground.Players(id: 18, position: 6, player: nil), SwiftPlayground.Players(id: 19, position: 7, player: nil)])])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多