【问题标题】:Create an array of Class objects by parsing JSON- SwiftyJSON通过解析 JSON-SwiftyJSON 创建一个 Class 对象数组
【发布时间】:2016-12-12 02:47:31
【问题描述】:

我有一个包含一些变量的类,我想通过使用 SwiftyJSON 解析 JSON 输出来创建该类的对象数组(我是 SwiftyJSON 的新手,因此在创建一个时遇到了一些问题)并显示它们使用表格

谁能帮我创建自定义类对象数组。

我的模型类:

    class RankDetailsModel
    {
        var key:String!
        var currentMonthRank: Int!
        var currentRevenue:Double!
        var lastMonthRank:Int!
        var lastMonthRevenue:Double!

        init?(rank: [String: Any]) {

            guard let key = rank["Key"] as? String,
            let currentMonthRank = rank["CurrentMonthRank"] as? Int,
            let currentRevenue = rank["CurrentRevenue"] as? Int,
            let lastMonthRank = rank["LastMonthRank"] as? String,
            let lastMonthRevenue = rank["LastMonthRevenue"] as? String
                else{
                    return nil
            }

            self.key = key;
        self.currentMonthRank = currentMonthRank;
        self.currentRevenue = Double(currentRevenue);
        self.lastMonthRank = Int(lastMonthRank);
        self.lastMonthRevenue = Double(lastMonthRevenue);
        }
    }

JSON 响应:

{ "AfxRank":
    [{
        "CurrentMonthRank" : 1,
        "Key" : "WSM",
        "CurrentRevenue" : 28834854,
        "LastMonthRevenue": null,
        "LastMonthRank": null
      },
      {
        "CurrentMonthRank" : 2,
        "Key" : "SAM",
        "CurrentRevenue" : 21880000,
        "LastMonthRevenue": null,
        "LastMonthRank": null
      },
      {
        "CurrentMonthRank" : 3,
        "Key" : "CI",
        "CurrentRevenue" : 11380000,
        "LastMonthRevenue": null,
        "LastMonthRank": null
      }]
}

我在 VC 中的代码:

var rankArray : [RankDetailsModel] = []
switch(response.result) {
                case .success(_):
                    if let data = response.result.value{

                        let jsonD = JSON(data) 
                        let dataNew = jsonD.rawString()?.data(using: String.Encoding.utf8) 
                        let jsonFinal = JSON(dataNew)
                        print(jsonFinal["AfxRank"]) //successfully printing the json array as shown above
                        rankArray = jsonFinal["AfxRank"].arrayValue as! [RankDetailsModel] //throwing an error 'RankDetailsModel' is not a subtype of JSON

//can I try something like this. (I didnt use SwifyJson and Alamofire in this case)
//if let userDict = json["AfxRank"] as? [String:Any]
//                        {
//                            guard let userObject = //RankDetailsModel(rank:userDict) else {
//                                print("Failed to create user from //dictionary")
//                                return
//                            }   
                    }
                    break

                case .failure(_):
                    print(response.result.error)
                    break

                }

【问题讨论】:

  • 您最终需要遍历 JSON 数组,将每个解析对象的数据传递到模型的初始化程序中。您是否尝试过您在评论中提到的方法?
  • @Tony 我尝试将其转换为字典,就像在 cmets 中一样。但它会抛出一个错误,说JSON doesnt have any member like [String:Any]。将重试并更新正确的错误消息

标签: ios arrays json swift3 swifty-json


【解决方案1】:

您的键 AfxRank 包含 Array 而不是字典,因此您需要将其类型转换为 [[String:Any]],然后通过循环和 append [RankDetailsModel] 数组中的对象。

var rankArray = [RankDetailsModel]()
if let userArray = json["AfxRank"].arrayValue as? [[String:Any]] {
    for dic in userArray {
        if let rankDetailObj = RankDetailsModel(rank: dic) {
            rankArray.append(rankDetailObj)
        }
    }
}

【讨论】:

  • 嗨尼拉夫。当我使用您的代码时,它在if let userArray = json["AfxRank"] as? [[String:Any]] { - cast from JSON to unrelated type [[String:Any]] always fail. 附近显示警告当我运行代码时,它不会进入 if 条件而只是退出。
  • [String:Any] is not a subtype of JSON 该行附近的错误:(
  • 我尝试使用if let userArray = json["AfxRank"].arrayObject as? [[String:Any]] { 并没有显示错误。但是然后它不满足条件if let rankDetailObj = RankDetailsModel(rank: dic) {并且没有进入就退出了if条件。
  • @ASN 在guard 语句之前的init 方法中尝试打印您的排名字典并检查它是否打印正确?
  • @ASN 可能问题出在这一行 let currentRevenue = rank["CurrentRevenue"] as? Double 使用 as? Int 然后将你转换为 Double。
猜你喜欢
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多