【问题标题】:I need help getting all the JSON data API provides我需要帮助来获取 API 提供的所有 JSON 数据
【发布时间】:2020-11-21 22:51:53
【问题描述】:

您好,您能帮我获取所有数据的数组,包括 global_rank、brawlhalla_id 等吗?我只能得到像legend_id、legend_key_name 这样的图例数组。这是json

{
    "name": "bmg | dan",
    "brawlhalla_id": 2,
    "rating": 1745,
    "peak_rating": 1792,
    "tier": "Platinum 2",
    "wins": 207,
    "games": 391,
    "region": "US-E",
    "global_rank": 5698,
    "region_rank": 1644,
    "legends": [
        {
            "legend_id": 4,
            "legend_name_key": "cassidy",
            "rating": 1736,
            "peak_rating": 1792,
            "tier": "Platinum 1",
            "wins": 161,
            "games": 300
        },
        {
            "legend_id": 21,
            "legend_name_key": "barraza",
            "rating": 1640,
            "peak_rating": 1640,
            "tier": "Gold 5",
            "wins": 41,
            "games": 77
        }
    ],
...

我的代码如下所示:

import SwiftUI

class BrawlhallaSevice {
    let url = URL(string: "http://sion.red/brawlhalla/ranked.json")!
    
    func getBrawlhalla(completion: @escaping (Result<[Brawlhalla], Error>) -> Void) {
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard error == nil else {
                completion(.failure(error!))
                return
            }
            
            completion(.success(self.getBrawlhallaResponse(fromData: data!)))
        }.resume()
    }
    
    
    private func getBrawlhallaResponse(fromData data: Data) -> [Brawlhalla] {
        let brawlhallaData = try? JSONDecoder().decode(BrawlhallaResponse.self, from: data)
        if let brawlhallaD = brawlhallaData {
            print(brawlhallaD)
         //return brawlhallaD.legends works and returns array of data about a legend
            return brawlhallaD
    
            
        }
        return [Brawlhalla(legend_name_key: "Error", rating: 0, peak_rating: 0, tier: "Error")]
    }
}

但它会引发错误:“无法将 'BrawlhallaResponse' 类型的返回表达式转换为返回类型 '[Brawlhalla]'”。 这就是我的模型的外观

import Foundation

struct BrawlhallaResponse: Codable {
    let legends: [Brawlhalla]
    let name: String
    let rating: Int
    let peak_rating: Int
    let tier: String
}
import Foundation

struct Brawlhalla: Codable {
    let name: String
    let rating: Int
    let peak_rating: Int
    let tier: String
}

我已尝试对代码进行许多更改,但似乎没有任何效果。

【问题讨论】:

  • Brawlhalla 有一个 name: String 属性,它不会出现在 JSON 中
  • 我不知道你是什么意思。我想要一个包含所有可用数据的数组,但我只能显示 .legends。我想要 json 文件顶部的数据,例如:名称、区域等。
  • 将您的 JSON 数据粘贴到 app.quicktype.io 以生成您需要的结构。
  • @DavidMartinek,我的意思是,在 JSON 中,在 legends: [ ] 数组中,对象没有属性 name,但在您的代码中,legends 映射到 [Brawlhalla],确实有属性name
  • 这是可能的。我有点新

标签: arrays json swift xcode


【解决方案1】:

我认为您得到了正确的代码,但您似乎正试图在 if let 语句中返回 brawhallaD。您收到错误是因为您的返回类型是 [Brawlhalla],但您返回的是 BrawlhallaResponse 类型的 decodedResponse。

所以你可以这样做:

class BrawlhallaSevice {
let url = URL(string: "http://sion.red/brawlhalla/ranked.json")!

func getBrawlhalla(completion: @escaping (Result<BrawlhallaResponse?, Error>) -> Void) {
    URLSession.shared.dataTask(with: url) { data, response, error in
        guard error == nil else {
            completion(.failure(error!))
            return
        }
        guard let safeData = data else { return }
        completion(.success(self.getBrawlhallaResponse(fromData: safeData)))
    }.resume()
}


private func getBrawlhallaResponse(fromData data: Data) -> BrawlhallaResponse?{
    let brawlhallaData = try? JSONDecoder().decode(BrawlhallaResponse.self, from: data)
    if let brawlhallaD = brawlhallaData {
        return brawlhallaD // Will return BrawlhallaResponse.peak_rating and also legends
    }
    return nil
}
}

【讨论】:

  • 此代码在我的时间线pastebin.com/bt7XrncJ 第 9 行“无法分配 'BrawlhallaResponse?' 类型的值”中引发错误输入“[BrawlhallaResponse]””
  • BrawlhallaResponse 不是数组。当您应该只返回类型 BrawlhallaResponse 时,您正在返回类型 [BrawlhallaResponse]。去掉括号就可以了
  • 然后它给了我这个错误:imgur.com/KoZjSl6
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 2020-07-19
  • 1970-01-01
  • 2012-11-18
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多