来自 Tracker Network API (SWIFT) 的 JSON
Posted
技术标签:
【中文标题】来自 Tracker Network API (SWIFT) 的 JSON【英文标题】:JSON from Tracker Network API (SWIFT) 【发布时间】:2018-10-31 03:17:34 【问题描述】:我在从我的 API 读取数据时遇到问题。我可以在 Xcode 中查看我的 API 中的所有数据。
这是我要解析的数据。
"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": ""
,
我正在尝试获取 Level 和 KD Ratio 的值并将其放在标签上。
但是,我收到错误“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】:实际上stats
对象不在data
对象内,而是在同一级别。所以,stats
数组不应该在 Data
类型内。同样在 stat 对象中,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)
【讨论】:
你没有处理所有事情。所有这些可选选项是怎么回事? 没有处理好所有事情?所有Optionals
是因为我不知道后端,由OP 决定哪些成员可以是optionals
或non-optionals
。该示例保证提供无崩溃代码。
修好你的钥匙,我会收回我的反对票。您缺少钥匙。
我相信,我们在 SO 上提供了一个问题的解决方案,而不是完整的实现,甚至 OP 都不在意。投票赞成或反对是个人选择,只要解决了 OP 的问题,我就可以了。
这行得通,让我可以看到 id 和 type。我的第二件事是如何从“Stat”获取显示值。每次我得到的显示值为 nil。以上是关于来自 Tracker Network API (SWIFT) 的 JSON的主要内容,如果未能解决你的问题,请参考以下文章