Ios 在Swift中解析包含数组的JSON

Ios 在Swift中解析包含数组的JSON,ios,swift,xcode6,Ios,Swift,Xcode6,我有下面的JSON对象 {"tags":[{"id":4,"name":"ExampleTitle","Memes":["http://someURL.com","http://anotherurl.com"]}]} 我试图将其解析为一个对象 struct TagModel { let id : Int let name : String let memes : [String] static func create( id: Int, name: String, m

我有下面的JSON对象

{"tags":[{"id":4,"name":"ExampleTitle","Memes":["http://someURL.com","http://anotherurl.com"]}]}
我试图将其解析为一个对象

struct TagModel {
   let id : Int
   let name : String
   let memes : [String]

   static func create( id: Int, name: String, memes: [String] ) -> TagModel {
       return TagModel( id: id, name: name, memes: memes);
   }
}
下面是我运行它来解析它的代码。但由于某些原因,它在URL数组“Memes”上失败。它不允许我将数组传递到currying方法中。本质上,我知道在let mkTag开头的行上调用的curry方法的语法不正确。我还没有弄明白正确的语法

import Foundation

func parseTag(cat: AnyObject) -> TagModel? {
    let mkTag = curry {id, name, memes in TagModel(id: id, name: name, memes: memes) }

    return asDict(cat) >>>= {
        mkTag <*> int($0,"id")
            <*> string($0,"name")
            <*> array($0, "Memes")
    }
}

func parseMemes(cat: AnyObject) -> MemeModel? {
    let mkMeme = curry {URL in MemeModel(URL: URL) }

    return asDict(cat) >>>= {
        mkMeme <*> string($0,"URL")
    }
}

func parseJSON(parsedJSON: [String:AnyObject]) -> [TagModel] {
    let tags = array(parsedJSON, "tags") >>>= {
            join($0.map(parseTag))
    }
    return tags!;
}

extension TagModel : Printable {
    var description : String {
        return "Tag { id = \(id), name = \(name)"
    }
}

func toURL(urlString: String) -> NSURL {
    return NSURL(string: urlString)
}


func asDict(x: AnyObject) -> [String:AnyObject]? {
    return x as? [String:AnyObject]
}


func join<A>(elements: [A?]) -> [A]? {
    var result : [A] = []
    for element in elements {
        if let x = element {
            result += [x]
        } else {
            return nil
        }
    }
    return result
}



infix operator  <*> { associativity left precedence 150 }
func <*><A, B>(l: (A -> B)?, r: A?) -> B? {
    if let l1 = l {
        if let r1 = r {
            return l1(r1)
        }
    }
    return nil
}

func flatten<A>(x: A??) -> A? {
    if let y = x { return y }
    return nil
}

func array(input: [String:AnyObject], key: String) ->  [AnyObject]? {
    let maybeAny : AnyObject? = input[key]
    return maybeAny >>>= { $0 as? [AnyObject] }
}

func dictionary(input: [String:AnyObject], key: String) ->  [String:AnyObject]? {
    return input[key] >>>= { $0 as? [String:AnyObject] }
}

func string(input: [String:AnyObject], key: String) -> String? {
    return input[key] >>>= { $0 as? String }
}

func number(input: [NSObject:AnyObject], key: String) -> NSNumber? {
    return input[key] >>>= { $0 as? NSNumber }
}

func int(input: [NSObject:AnyObject], key: String) -> Int? {
    return number(input,key).map { $0.integerValue }
}

func bool(input: [NSObject:AnyObject], key: String) -> Bool? {
    return number(input,key).map { $0.boolValue }
}


func curry<A,R>(f: (A) -> R) -> A -> R {
    return { a in f(a) }
}

func curry<A,B,R>(f: (A,B) -> R) -> A -> B -> R {
    return { a in { b in f(a,b) } }
}

func curry<A,B,C,R>(f: (A,B,C) -> R) -> A -> B -> C -> R {
    return { a in { b in {c in f(a,b,c) } } }
}

func curry<A,B,C,D,R>(f: (A,B,C,D) -> R) -> A -> B -> C -> D -> R {
    return { a in { b in { c in { d in f(a,b,c,d) } } } }
}

infix operator  >>>= {}

func >>>= <A,B> (optional : A?, f : A -> B?) -> B? {
    return flatten(optional.map(f))
}

好的,我现在没有留下任何想象。

最好解释一下你的代码是做什么的,以及它是如何解决问题的。这不是给了我一个NSDictionary而不是TagModel数组吗?是的,但是创建一个
TagModel.init(dict:NSDictionary)很简单
方法,该方法仅将键中的值分配给属性。我将编辑答案以显示此内容。啊,对不起,我看到了您刚才显示的内容。谢谢。我添加了MemeModel。
struct MemeModel {
   let URL: String

   static func create( URL: String ) -> MemeModel {
       return MemeModel ( URL: URL );
   }
}
let str: NSString = "{\"tags\":[{\"id\":4,\"name\":\"ExampleTitle\",\"Memes\":[\"http://someURL.com\",\"http://anotherurl.com\"]}]}"

struct TagModel {
    let id : Int
    let name : String
    let memes : [String]

    init(dict: NSDictionary) {
        id = dict["id"] as Int
        name = dict["name"] as String
        memes = dict["Memes"] as [String]
    }
}


var tagModels: [TagModel] = []
var error: NSError?
if let data = NSJSONSerialization.JSONObjectWithData(str.dataUsingEncoding(NSUTF8StringEncoding)!, options: nil, error: &error) as? NSDictionary {
    for tag in data["tags"] as [NSDictionary] {
        let tagModel = TagModel(dict: tag)
        tagModels.append(tagModel)
    }
}