我有一个类似的结构
struct Channel {
var id : Int = 0
var name = ""
}
我从 URL 获取 json 为
{"channel_list":[{"channel_id":0,"channel_name":"test1"},{"channel_id":0,"channel_name":"test2"}]}
但是我无法获取数据
func parseJson(anyObj:AnyObject) -> Array<Channel>{
var list:Array<Channel> = []
if anyObj is Array<AnyObject> {
var b:Channel = Channel()
for json in anyObj as! Array<AnyObject>{
b.id = (json["channel_id"] as AnyObject? as? Int) ?? 0
b.name = (json["channel_name"] as AnyObject? as? String) ?? ""
list.append(b)
}
}
return list
}
//read code
let anyObj: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0),error: nil) as AnyObject?
println(anyObj)
if let myobj=anyObj["channel_list"] as AnyObject {
self.Channellist=self.parseJson(anyObj!)
}
这有什么问题吗?
最佳答案
首先,不要使用 AnyObject
,您应该将 JSON 响应转换为字典:[NSObject:AnyObject]
然后安全地转换 anyObj[ "channel_list"]
到字典数组 [[NSObject:AnyObject]]
,因为这是您的 JSON 响应格式。
然后你需要在你的parseJSON
函数中使用这个类型。我们也在简化它,因为不再需要进行奇怪的转换。
此外,您向函数传递了错误的参数(您使用了 anyObj
而不是 myObj
)。
struct Channel {
var id : Int = 0
var name = ""
}
func parseJson(anyObj: [[NSObject:AnyObject]]) -> Array<Channel>{
var list: Array<Channel> = []
var b: Channel = Channel()
for json in anyObj {
b.id = (json["channel_id"] as? Int) ?? 0
b.name = (json["channel_name"] as? String) ?? ""
list.append(b)
}
return list
}
if let anyObj = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(0),error: nil) as? [NSObject:AnyObject] {
if let myobj = anyObj["channel_list"] as? [[NSObject:AnyObject]] {
self.Channellist=self.parseJson(myobj)
}
}
仍有改进的余地:例如,您可以为 Struct 创建一个初始化程序,还可以为响应类型创建一个类型别名,使用 map
创建列表等。
关于ios - Swift 将 json 解析为结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31191569/