如何解析这种类型的数组?

时间:2016-03-18 11:12:59

标签: ios arrays swift

当我尝试做的时候我接下来了:

for item in serverResponse {
    print(item)
}
它给了我:

("0", {
  "id" : 1,
  "name" : "Programming"
})
("1", {
  "id" : 2,
  "name" : "Music"
})

如何解析此数组以在那里取name?我和它混淆= /

更新

完整的回复是:

{
    "name": "ABC",
    "books": [
        {
            "id": 1,
            "name": "Programming"
        }
        {
            "id": 2,
            "name": "Music"
        }
    ]
}

4 个答案:

答案 0 :(得分:0)

您正在寻找将Json转换为要读取name的对象。原始解决方案是解析名称。更好的方法是使用SwiftyJsonObjectMapper

答案 1 :(得分:0)

如果您从服务器获得Json,则可以使用它:

func getJSON(urlToRequest: String) -> NSData{
    return NSData(contentsOfURL: NSURL(string: urlToRequest)!)!
}

func parseJSON(inputData: NSData) -> NSArray{
    let boardsDictionary = try! NSJSONSerialization.JSONObjectWithData(inputData, options: .AllowFragments) as! NSArray

    return boardsDictionary
}

然后使用myData = parseJSON(json),您可以使用

访问名称
let data = myData[0] as! NSDictionary
let name = data["name"]! as? String

答案 2 :(得分:0)

for item in serverResponse {
    let itemArray = (item as? NSDictionary)["books"] as? NSArray
    for (var i = 0; i < itemArray.count ; i++ ) {
        if let dic1 = itemArray[i] as? NSDictionary {
           let item: String!
           item = dic1["name"] as? String
           print(item)
        }
    }
}

答案 3 :(得分:0)

我不喜欢在Swift中处理字典。我发现对象表现更好,更易于管理 - 它们也更安全。

所以我的建议是将你的回复解析为“Book”结构,然后你可以轻松访问这些结构的属性(id,name)。

创建一个完成所有工作的课程可能会更好。

出于测试目的,我已经复制了您的回复:

let response: NSDictionary = ["name": "ABC", "books": [["id": 1, "name": "Programming"], ["id": 2, "name": "Music"]]]

现在让我们首先制作我们的Book结构。

它将具有两个属性,还有一个初始化程序,它将解码响应的“books”键中位于数组中的每个字典的内容。初始化程序是可用的,因为内容可能不可解码。

struct Book {
    let id: Int
    let name: String

    init?(_ object: AnyObject) {
        if let dictionary = object as? NSDictionary,
            dictId = dictionary["id"] as? Int,
            dictName = dictionary["name"] as? String {
            self.id = dictId
            self.name = dictName
        } else {
            return nil
        }
    }
}

现在我们可以创建一个可以容纳所有书籍的课程。我们需要另一个初始化器,它将迭代内容并使用结构创建对象:

class BooksManager {

    var books = [Book]()

    init(response: NSDictionary) {
        if let array = response["books"] as? NSArray {
            self.books = array.flatMap { Book($0) }
        }
    }

}

好的,现在我们已经完成了样板代码的编写,我们可以使用我们的玩具。

创建类的实例:

let manager = BooksManager(response: response)

就是这样!现在,该类包含对象,您可以轻松访问其属性。

例如使用循环:

for book in manager.books {
    print("Book id: \(book.id), book name: \(book.name)")
}

结果:

  

图书编号:1,图书名称:编程
  书号:2,书名:音乐

让我们说你想要第一本书的名字:

if let nameOfFirstBook = manager.books.first?.name {
    print(nameOfFirstBook)
}

结果:

  

编程

最后一个例子,假设您要收集数组中的所有书名:

let booksNames = manager.books.map { $0.name }

结果:

  

[“编程”,“音乐”]