来自 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 是一个子对象,其键有keycategoryKeycategoryName 等,而valuepercentiledisplayValuestat 对象的一部分。可解码类型的正确实现如下,

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?

所以,现在你应该decodeTrackerResponse,如下所示,

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 决定哪些成员可以是optionalsnon-optionals。该示例保证提供无崩溃代码。 修好你的钥匙,我会收回我的反对票。您缺少钥匙。 我相信,我们在 SO 上提供了一个问题的解决方案,而不是完整的实现,甚至 OP 都不在意。投票赞成或反对是个人选择,只要解决了 OP 的问题,我就可以了。 这行得通,让我可以看到 id 和 type。我的第二件事是如何从“Stat”获取显示值。每次我得到的显示值为 nil。

以上是关于来自 Tracker Network API (SWIFT) 的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

fastdfs的配置文件详解

从 XBOX API 获取玩家数据

docker安装FastDFS

请教一个关于tracker server的问题拜托各位了 3Q

来自上下文案例类的隐式 val

在来自 Tracker Server (bitTorrent) 的 Annouce 响应中解析 Peers IP 地址