通过解析 JSON-SwiftyJSON 创建一个 Class 对象数组

Posted

技术标签:

【中文标题】通过解析 JSON-SwiftyJSON 创建一个 Class 对象数组【英文标题】:Create an array of Class objects by parsing JSON- SwiftyJSON 【发布时间】: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]。将重试并更新正确的错误消息 【参考方案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。

以上是关于通过解析 JSON-SwiftyJSON 创建一个 Class 对象数组的主要内容,如果未能解决你的问题,请参考以下文章

Javascript创建对象几种方法解析

sql while循环.net通过隐藏变量解析值到javascript函数以创建图表

通过正则表达式解析 CSS

Java通过DOM解析假装实现Spring中Bean注入

通过python创建域名解析文件excel格式(可用来导入阿里云)

String类型解析