簡體   English   中英

iOS快速Alamofire解析,創建通用類以解析json數據

[英]iOS swift Alamofire parsing, creating generic class to parse json data

我有要解析的JSON數據:

{
    "data": {
        "user_name": "JohP llDoe",
        "email_address": "tozto@gmail.com"
    },
    "result": {
        "code": 0
    }
}

數據類型從Web服務更改為另一種,但一般結構始終相同。

因此,我使用EVReflection創建此通用類來解析數據:

class MyResponse<T>: EVObject {

    var data : T?
    var result : Result?

}

class Result: EVObject {
    var message : String = ""
    var code : Int = 0
}

對於數據:

class Preaccount : EVObject {
    public var user_name : String = ""
    public var email_address : String = ""
}

並調用Web服務,我創建了以下方法:

Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers)

            .responseObject { (response: DataResponse<MyResponse<Preaccount>>) in

                if response.result.isSuccess {

                    print(response.result.value!)
                }

                if response.result.isFailure {
                    let error : Error = response.result.error!
                }
        }

現在我訪問不暢:

在此處輸入圖片說明

有沒有一種方法可以創建通用方法並在參數中傳遞解析后的模型。

你可以試試這個

class MyResponse: EVObject {

    var data : Preaccount?
    var result : Result?

}

並處理響應數據

Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers)

            .responseObject { (response: DataResponse) in

     if response.result.isSuccess {

              print(response.result.value!)
             var myResponse = MyResponse(json:response.result.value!)
       }
   .......
}

最后,這是我針對該問題的解決方案:

struct MyResponse<T: Decodable>: Decodable {
    var data : T?
    var result : Result?
}

struct Result: Decodable {
    let message : String?
    let code : Int
    let form_errors : [String: [String]]?
}

struct Preaccount : Decodable {
    let user_name : String
    let email_address : String
}

並調用Web服務:

func postRequest<T: Decodable>(url: String,
                                   params : [String: Any]?,
                                   returnType : T.Type)
    {

        Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers)

            .responseDecodableObject { (response: DataResponse<FindoorResponse<T>>) in
                //...
        }
    }

這是調用該方法的示例:

 AlamofireHelper.shared().postRequest(url: CHECK_USERNAME_URL, params: parameters, returnType: Preaccount.self)

我建議改用Decodable

struct MyResponse<T: Decodable>: Decodable {
    let data: T?
    let result: Result?
}

struct Result: Decodable {
    var message: String?
    var code: Int
}

struct Preaccount: Decodable {
    let user_name: String
    let email_address: String
}

let data = """
{
    "data": {
        "user_name": "JohP llDoe",
        "email_address": "tozto@gmail.com"
    },
    "result": {
        "code": 0
    }
}
""".data(using: .utf8)!
let result = try? JSONDecoder().decode(MyResponse<Preaccount>.self, from: data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM