我的json响应如下:
{
"http_status": 200,
"success": true,
"has_error": false,
"error": [
""
],
"response": {
"token": "",
"verified": false,
"message": ""
}
}
据我所知,应用程序API用法http_status,成功,has_error,在所有API之间共享错误,因此我将创建一个可编码类来处理它,但是响应可能是不同的模型,所以这就是什么我正在尝试做。
我已经创建了一个常规响应类,因此我可以在项目中的所有API使用此类,以避免重复同一类,但名称不同:
class GeneralResponse:Codable {
let http_status: Int?
let success, has_error: Bool?
let error: [String]?
enum CodingKeys: String, CodingKey {
case http_status = "http_status"
case success = "success"
case has_error = "has_error"
case error = "error"
}
init(http_status: Int?, success: Bool?, has_error: Bool?,error: [String]?) {
self.http_status = http_status
self.success = success
self.has_error = has_error
self.error = error
}
}
现在,我创建了响应类,该类别将处理现在的注册响应:
class RegistrationResponseDetails: Codable {
let token: String?
let verified: Bool?
let message: String?
init(token: String?, verified: Bool?, message: String?) {
self.token = token
self.verified = verified
self.message = message
}
}
,可以说我需要解析注册响应,所以这是我所做的,我创建了一个班级并使用了这两个:
class RegistrationResponse: Codable {
let generalResponse:GeneralResponse?
let response: RegistrationResponseDetails?
init(generalResponse: GeneralResponse?, response: RegistrationResponseDetails?) {
self.generalResponse = generalResponse
self.response = response
}
}
因此,我将主要使用registrationResponse来解析响应,该响应将解析包括http_status,成功,has_error,error,错误,然后响应将解析所需的响应对象。
但在某个时候,通用物源对象始终为零,并且响应正确解析了数据,我该怎么做才能使GeneralResponse在每个API中无需重复,因为在每个API中,我都会有通用响应对象,因此可以求解它?
注意:我正在使用Alamofire作为网络库。
您可以制作GeneralResponse
通用,并告诉解析响应时要使用哪种类型:
class GeneralResponse<T: Codable>: Codable {
let http_status: Int?
let success, has_error: Bool?
let error: [String]?
let response: T?
}
class RegistrationResponseDetails: Codable {
let token: String?
let verified: Bool?
let message: String?
}
然后,当您解析JSON:
时,您可以给它一个内部响应类别let generalResponse = try JSONDecoder().decode(GeneralResponse<RegistrationResponseDetails>.self, from: jsonData)
// generalResponse.response is of type RegistrationResponseDetails?
首先,如果
http_status,成功,has_error,在所有apis之间共享错误
为什么类属性可选?
如果提到的键相同,但是键response
的值不同。
在大多数情况下struct
S足够。
struct JSONParser<T : Decodable> {
struct Response<U : Decodable> : Decodable {
let httpStatus: Int
let success, hasError: Bool
let error: [String]
let response : U
}
let responseData : Response<T>
init(data: Data) throws {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
responseData = try decoder.decode(Response.self, from: data)
}
}
然后创建不同的结构,例如
struct RegistrationResponseDetails : Decodable {
let token: String
let verified: Bool
let message: String
}
并解析
let parser = try JSONParser<RegistrationResponseDetails>(data: data)
let registrationResponseDetails = parser.responseData.response
对于简单的情况
class Main:Decodable {
let name:String? // insert all shared vars
}
class Sub:Main {
let id:String?
}
这将分析
{
"name" : "rr" ,
"id" : "oo"
}