通过解析 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 对象数组的主要内容,如果未能解决你的问题,请参考以下文章
sql while循环.net通过隐藏变量解析值到javascript函数以创建图表