簡體   English   中英

Swift解析JSON以構造

[英]Swift parse json to struct

我有一個像

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"]的結果安全地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創建列表,等等。

這就是我使用Swift 2的方法:

struct Channel {
    var id : Int
    var name: String
    init?(JSON: [NSObject: AnyObject]?) {
          guard let channelID = json["channel_id"] as? Int, let channelName = json["channel_name"] as? String
          else { name = ""; id = 0; return nil }
          name = channelName
          id = channelID
    }
}
func parseJSON(array: [[NSObject:AnyObject]]) -> [Channel?] {
    return array.map { Channel(JSON: $0) }
    // If you don't want to return optionals to channel you can do this instead:
   // return array.map { Channel(JSON: $0) }.filter { $0 != nil }.map { $0! }
}
// And in the caller
do {
     guard let dict = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [NSObject : AnyObject] 
     else { throw NSError(domain ... // Setup error saying JSON wasn't parsed. }
     guard let arrayContents = dict["channel_list"] as? [[NSObject:AnyObject]]
     else  { throw NSError(domain ... // Setup error saying array wasn't found. }
     let channels = parseJSON(arrayContents)
}
catch {
    print(error)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM