JSON от Tracker Network API (SWIFT) - PullRequest
       5

JSON от Tracker Network API (SWIFT)

0 голосов
/ 31 октября 2018

У меня проблемы с чтением данных из моего API. Я вижу все данные, которые есть в моем API в XCode.

Вот данные, которые я пытаюсь проанализировать.

  "data": {
    "id": "2f464c52-81a5-4b2d-9d08-21baf10134bd",
    "type": "player",
    "metadata": {
      "statsCategoryOrder": [
        "levels",
        "combat",
        "game",
        "bullets",
        "ekia-enemy-killed-in-action",
        "objective",
        "team-play",
        "extra"
      ],
      "platformId": 1,
      "platformUserHandle": "BarMexico67",
      "accountId": "2f464c52-81a5-4b2d-9d08-21baf10134bd",
      "cacheExpireDate": "10/31/2018 1:45:55 AM"
    },
    "stats": [
      {
        "metadata": {
          "key": "level",
          "name": "Level",
          "categoryKey": "levels",
          "categoryName": "Levels",
          "isReversed": false,
          "iconUrl": "https://cod-cdn.tracker.gg/assets/ranks/rank_6.png"
        },
        "value": 6.0,
        "percentile": 92.0,
        "displayValue": "6"
      },
      {
        "metadata": {
          "key": "KDRatio",
          "name": "KD Ratio",
          "categoryKey": "combat",
          "categoryName": "Combat",
          "isReversed": false
        },
        "value": 0.39,
        "percentile": 96.0,
        "displayValue": "0.39",
        "displayRank": ""
      },

Я пытаюсь получить значения как для уровня, так и для коэффициента KD и разместить их на этикетке.

Однако я получаю сообщение об ошибке "keyNotFound (CodingKeys (stringValue:" stats ", intValue: nil)

Вот мой текущий код. Любая помощь будет отличной.

struct Data: Decodable {
    let id: String?
    let type: String?
    let stats: [Stats]
}

struct Stats: Decodable {
    let name: String?
    let categoryName: String?
    let displayValue: Int?
    let value: Int?
}

class StatTrackerVC: UIViewController {

    @IBOutlet weak var accountNameLabel: UILabel!

    let blackOps4TrackerNetworkAPI = "4db06ff7-4499-494d-8d75-93a9b38292a3"
    let urlString = URL(string: "https://cod-api.tracker.gg/v1/standard/bo4/profile/1/BarMexico67")


    override func viewDidLoad() {
        super.viewDidLoad()

        let jsonUrlString = "https://cod-api.tracker.gg/v1/standard/bo4/profile/1/BarMexico67"
        guard let url = URL(string: jsonUrlString) else
            { return }

        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        request.addValue(blackOps4TrackerNetworkAPI, forHTTPHeaderField: "TRN-Api-Key")


        URLSession.shared.dataTask(with: request) { (data, response, err) in
            //Perhaps Check Err
            //Check Response Status 200 OK

            guard let data = data else { return }

//            let dataAsString = String(data: data, encoding: .utf8)
//            print(dataAsString!)

            do {
                let stats = try JSONDecoder().decode(Data.self, from: data)
                print(stats)

            } catch let jsonErr {
                print("Error Serializing JSON:", jsonErr)
            }
        }.resume()

    }

1 Ответ

0 голосов
/ 31 октября 2018

На самом деле stats объект не находится внутри объекта data, скорее, они находятся на одном уровне. Таким образом, массив stats не должен быть внутри типа Data. Также внутри объектов статистики, metaData является дочерним объектом с ключами типа key, categoryKey, categoryName и т. Д., В то время как value, percentile и displayValue являются частью объекта stat. Правильная реализация декодируемых типов, как показано ниже,

struct TrackerResponse: Decodable {
     let data: StatData?
     let stats: [Stat]?
}

struct StatData: Decodable {
    let id: String?
    let type: String?
    let accountId: String?
    let platformId: Int?
}


struct Stat: Decodable {
    let value: Int?
    let metadata: StatMeta?
    let percentile: Int?
    let displayValue: String?
}

struct StatMeta: Decodable {
    let key: String?
    let name: String?
    let categoryKey: String?
    let categoryName: String?
}

Итак, теперь вы должны decode TrackerResponse, как показано ниже,

do {
    print(String(data: data, encoding: .utf8))
    let response = try JSONDecoder().decode(TrackerResponse.self, from: data)
    print(response.data?.id)

} catch let jsonErr {
    print("Error Serializing JSON:", jsonErr)
}
...