iOS swift Alamofire解析,创建泛型类来解析json数据

时间:2018-01-29 15:26:55

标签: ios json swift generics alamofire

我要解析这个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!
                }
        }

现在我的访问权限很差:

enter image description here

是否有办法创建通用方法并在参数中传递已解析的模型。

3 个答案:

答案 0 :(得分:1)

你可以试试这个

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!)
       }
   .......
}

答案 1 :(得分:0)

最后,这是我解决问题的方法:

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
}

并致电网络服务:

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)

答案 2 :(得分:-1)

我建议改为使用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)
相关问题