ios - Swift 将 json 解析为结构体

标签 ios swift

我有一个类似的结构

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/

相关文章:

swift - 如何对 URL 进行编码以在 Swift 中传递百分比 (%) 符号?

ios - 无法理解崩溃的堆栈跟踪

iphone - 跳转到UITabBarViewController中的另一个ViewController

iOS Swift - 设计类 HTML 表格的有效方法

ios - SwiftUI 中的 NumberFormatter - 使用未解析的标识符 'formatter'

swift - 使 UIImage 适合 UIView 内部的 UIImageView

swift - 可选枚举初始值设定项不适用于 where 子句

ios - 为什么我的语言包路径在iOS Swift中返回nil?

ios - 在 iPhone 上切换 WIFI 和 GPRS 通知/

ios - 崩溃问题 : iOS 12. 0.1 ( 16A404 ), App 自动关闭