Ios 在Swift中解析包含数组的JSON
我有下面的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
{"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)
}
}