json - 快速获取 Json 5

标签 json swift xcode rest swift5

我正在尝试从 swift 5 中的 api 获取一些数据

我收到此错误

Member 'success' in 'Result<[Suggestion], SuggestionError>' produces result of type 'Result', but context expects 'Result<[Suggestion],

这个函数给我带来了问题。如果我评论给我带来麻烦的行,它会打印 canNotProcessData

func getSuggestions (completion: @escaping(Result<[Suggestion], SuggestionError>) -> Void){
    let dataTask = URLSession.shared.dataTask(with: resourceURL) { data, response, error in
        guard let jsonData = data else{
            completion(.failure(.noDataAvailable))
            return
        }
        print(response!)
        do{
            let decoder = JSONDecoder()
            let suggestionReponse = try decoder.decode(Suggestion.self, from: jsonData)
            let suggestions = suggestionReponse

            completion(.success(Suggestion))

        }catch{
            completion(.failure(.canNotProcessData))
        }

    }
    dataTask.resume()  
}

这是我的建议结构

struct Suggestion:Decodable{
    var id: Int
    var hometeam: String
    var awayteam: String
    var hometeamLogo: String
    var awayteamLogo: String
    var bet: String
    var value: Double
    var stake: Int
    var bookieOdds: Double
}

这是我从 api 收到的示例

[
    {
        "id": 132,
        "hometeam": "Afjet Afyonspor",
        "awayteam": "Sancaktepe Belediyespor",
        "hometeamLogo": "https://media.api-football.com/teams/3565.png",
        "awayteamLogo": "https://media.api-football.com/teams/3604.png",
        "bet": "2",
        "value": 1.19,
        "stake": 1,
        "bookieOdds": 2.55
    },

    {
        "id": 152,
        "hometeam": "Bolívar",
        "awayteam": "Blooming",
        "hometeamLogo": "https://media.api-football.com/teams/3702.png",
        "awayteamLogo": "https://media.api-football.com/teams/3701.png",
        "bet": "2",
        "value": 3.18,
        "stake": 1,
        "bookieOdds": 11
    }
]

最佳答案

您应该更好地准确地显示整个消息:

Member 'success' in 'Result<[Suggestion], SuggestionError>' produces
result of type 'Result<Success, Failure>', but context expects
'Result<[Suggestion], SuggestionError>'

这显然是错误的,因为您在此处传递类型名称:

            completion(.success(Suggestion))

但是在这行之前,你有一件事错了:

            let suggestionReponse = try decoder.decode(Suggestion.self, from: jsonData)

JSON 响应的最外层结构是一个数组 ([ ... ]),您需要将其解码为 Array 建议,而不是建议:

请尝试这样的事情:

    func getSuggestions(completion: @escaping(Result<[Suggestion], SuggestionError>) -> Void){
        let dataTask = URLSession.shared.dataTask(with: resourceURL) { data, response, error in
            guard let jsonData = data else{
                completion(.failure(.noDataAvailable))
                return
            }
            print(response!)
            do{
                let decoder = JSONDecoder()
                //### Use `[Suggestion].self`, not `Suggestion.self`
                let suggestions = try decoder.decode([Suggestion].self, from: jsonData)
                completion(.success(suggestions)) //###Use the response, not the type name
            } catch {
                print(error) //### This gives you some hints on how to solve the error cases
                completion(.failure(.canNotProcessData))
            }
        }
        dataTask.resume()
    }

关于json - 快速获取 Json 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231606/

相关文章:

c# - 解析json文件以获取数据

javascript - Strapi:获取深度嵌套关系的所有嵌套属性

ios - 如何防止父 UIView 接收来自 UIButton 的触摸?

iphone - 当应用程序进入前台时查找当前 View 。 IOS

json - Go json.Unmarshal 字段案例

ios - 在不同的部分配置不同行数的 UITableView

ios - 快速进行网络编程?

ios - 使用 Swift 创建 iOS 应用程序,需要知道如何使用 mysql 数据库跟踪用户数据?

ios - 在 AddressBook iOS 中根据最近使用/最常用/紧急程度对联系人进行排序

javascript - 使用 D3.js 加载本地数据以进行可视化