[英]How to parse such type array?
當我想要做的時候,我得到了下一個:
for item in serverResponse {
print(item)
}
它給了我:
("0", {
"id" : 1,
"name" : "Programming"
})
("1", {
"id" : 2,
"name" : "Music"
})
我如何解析這個數組以name
? 我和它混淆= /
UPDATE
完整的答復是:
{
"name": "ABC",
"books": [
{
"id": 1,
"name": "Programming"
}
{
"id": 2,
"name": "Music"
}
]
}
您正在尋找將Json轉換為要讀取name
的對象。 原始解決方案是解析名稱。 更好的方法是使用SwiftyJson或ObjectMapper 。
如果從服務器獲取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
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)
}
}
}
我不喜歡在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)")
}
結果:
圖書ID:1,圖書名稱:Programming
書號:2,書名:音樂
讓我們說你想要第一本書的名字:
if let nameOfFirstBook = manager.books.first?.name {
print(nameOfFirstBook)
}
結果:
程序設計
最后一個例子,假設您要收集數組中的所有書名:
let booksNames = manager.books.map { $0.name }
結果:
[“編程”,“音樂”]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.