簡體   English   中英

如何解析這樣的類型數組?

[英]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的對象。 原始解決方案是解析名稱。 更好的方法是使用SwiftyJsonObjectMapper

如果從服務器獲取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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM