【问题标题】:iOS swift Alamofire parsing, creating generic class to parse json dataiOS swift Alamofire解析,创建泛型类解析json数据
【发布时间】:2018-01-29 15:26:54
【问题描述】:

我有这个 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 = ""
}

为了调用我创建了这个方法的网络服务:

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

现在我的访问权限不好:

有没有办法创建一个泛型方法并在参数中传递解析后的模型。

【问题讨论】:

    标签: ios json swift generics alamofire


    【解决方案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!)
           }
       .......
    }
    

    【讨论】:

    • 感谢您的回答,对我有帮助!
    【解决方案2】:

    最后是我的解决方案:

    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)
    

    【讨论】:

      【解决方案3】:

      我建议改用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)
      

      【讨论】:

        猜你喜欢
        • 2020-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        相关资源
        最近更新 更多