使用Swift从JSON中提取数组

时间:2016-03-28 13:39:46

标签: json swift

大量的Java经验,但与Swift的相对n00b。我有以下JSON,我无法提取“图像”数组,这可能有多达3个图像......

   {
      "status" : "OPEN",
      "description" : “…”,
      "name" : “…”,
      "owner" : 1,
      "images" : [
        {
          "id" : 1,
          "path" : "\/uploads\/1-60003456.jpeg"
        }
      ],
      "created" : 1459135829000,
      "id" : 1
    }

我一直遇到很多编译时和运行时错误。例如,来自SwiftyJSON文档的代码:

for (key,subJson):(String, JSON) in json {
    if(key == "images"){
        let myImages = subJson.array
        print(myImages![0]["path"])
    }
}

正确地打印出“path”的值,但是试图在我的[String]图像中保存该值:

images.append(myImages![0]["path"] as String)

给出错误“无法使用String类型的索引下标类型JSON的值”

XCode告诉我subJson是一个用于“images”的NSDictionary(或者它是一个字典数组?),但是,当我尝试这样做时,我得到“无法转换类型JSON的值以在coersion中键入NSDictionary ”

我确定这是一个简单的语法错误,但在这一点上,我只是在各种错误之间来回走动。感谢您提供任何指导。

1 个答案:

答案 0 :(得分:0)

不要使用向下转换,SwiftyJSON已经完成了这项工作。 SwiftyJSON有一个可选的getter,用于表示已经解析的对象的字符串表示:

myImages![0]["path"].string

因为它是一个可选项,你想安全地打开它:

if let path = myImages![0]["path"].string {
    images.append(path)
}

如果myImages![0]["path"]不是String,那么SwiftyJSON为您提供与JSON类型一样多的可选getter:

myImages![0]["path"].array
myImages![0]["path"].dictionary
myImages![0]["path"].int

使用SwiftyJSON,你也可以直接下标:

if let firstImagePath = json["images"][0]["path"].string {
    // use "firstImagePath"
}

总结一下,另一种循环:

if let images = json["images"] {
    for image in images {
        if let path = image["path"].string {
            // use "path"
        }
    }
}