可编码和可选的JSON字段

问题描述 投票:0回答:1

[有很多API会在发生问题时以适当的HTTP状态代码响应,但是也有一些API总是以200状态代码响应,这些状态代码描述了特定JSON字段中的错误。这正是我的情况。因此,我制定了一个BasicResponse协议,该协议要求任何Codable结构具有这些必填字段:

protocol BasicResponse: Codable {
    var response: String { get }
    var message: String? { get }
}

我的Codable结构现在看起来像这样:

struct GetTicketsResponse: Codable, BasicResponse {
    var response: String
    var message: String?

    var tickets: [Ticket]
}

而且我还创建了某种中间件解码器,以在早期阶段识别错误:

class AdvancedDecoder {

    func decode<T: BasicResponse>(_ type: T.Type, from data: Data) throws -> T {
        let result = try JSONDecoder().decode(T.self, from: data)

        // Check if session is valid
        if (result.message == "Session invalid") { throw AdvancedError.invalidSession }

        return result
    }

}

但是我注意到这种方法存在问题。如果服务器上发生故障,它将返回具有responsemessage字段但不具有tickets字段的JSON,因此解码响应始终会失败。我可以将tickets数组标记为可选类型var tickets: [Ticket]?,但对我来说这似乎是一个非常奇怪的解决方法。这里有两个JSON供参考:

// If everything went smoothly
{
    "response" : "OK",

    "tickets" : [...]
}

// If something went wrong
{
    "response" : "ERROR",
    "message" : "Session invalid"
}

那么我该如何处理这种情况?我敢打赌,有一种更好的解决方案。在此先感谢:)

json swift codable
1个回答
0
投票
您可以为成功和失败设置两个不同的Response结构。如果成功解码失败,请尝试使用失败响应进行解码。
© www.soinside.com 2019 - 2024. All rights reserved.