Трюк состоит в том, чтобы объявить правильный тип для броска.
Для ваших данных мы используем [String: [[String: AnyObject]]]
: словарь со строковым ключом и массив словарей в качестве значения, эти словари имеют значение AnyObject
, потому что существует несколько возможных типов.
После успешного декодирования мы печатаем результирующий словарь (результат 1).
Затем, в качестве примера, мы перебираем словари, содержащиеся в массиве за ключом «Зеленая рубашка», и отображаем их идентификатор и размер.
И как последний пример: получите массив со всеми предметами одежды.
if let json = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.allZeros, error: nil) as? [String: [[String: AnyObject]]] {
// Result 1
println(json)
// Example of how to parse the data
if let allGreenShirts = json["Green Shirt"] {
for greenShirt in allGreenShirts {
if let id = greenShirt["id"] as? String, let size = greenShirt["size"] as? String {
println("ID \(id) is of size \(size)")
}
}
}
// If you want an array of all the clothes, populate an array of dictionaries:
var allClothes = [[String:AnyObject]]()
for (_, clothes) in json {
allClothes += clothes
}
println(allClothes)
}
Результат 1:
[Белый Пояс: [[Размер: один размер, цена: 0,00, категория:, марка: модель:, изображение: https://google.com/white_belt.jpg, category_name:, new_record: 0 , имя: White Belt, sku:, id: 1536, количество: 37, bar_code:]], Green Shirt: [[размер: XXS, цена: 15.00, sku:, имя: Nice Green Shirt, id: 740, make: , модель:, image: https://google.com/green_shirt.jpg, category_name:, количество: 0, bar_code:, new_record: 0], [размер: XS, цена: 20.00, sku:, имя: Green Shirt, id: 743, make:, model:, image: https://google.com/green_shirt.jpg, category_name:, количество: 68, bar_code:, new_record: 0]], Dark Blue Jeans: [[размер: S, pri ce: 0.00, category:, make:, model:, image: https://google.com/dark_blue_jeans.jpg, category_name:, new_record: 0, имя: Dark Blue Jeans, sku:, id: 1588, количество: 0, bar_code:], [размер: XL, цена: 0,00, категория:, Марка:, модель:, image: https://google.com/dark_blue_jeans.jpg, category_name:, new_record: 0, имя: Dark Blue Jeans, sku:, id: 1559, количество: 4, bar_code:]]]
Пример:
ID 740 имеет размер XXS
ID 743 имеет размер XS
Массив всей одежды:
[[размер: один размер, цена: 0.00, категория:, Марка:, модель:, image: https://google.com/white_belt.jpg, category_name:, new_record: 0, имя: White Belt, sku:, id: 1536, количество: 37, bar_code:], [размер: XXS, цена: 15.00 , sku:, имя: Nice Green Shirt, id: 740, make:, model:, image: https://google.com/green_shirt.jpg, category_name:, количество: 0, bar_code:, new_record: 0], [размер: XS, цена: 20.00, sku: , имя: Green Shirt, id: 743, make:, model:, image: https://google.com/green_shirt.jpg, category_name:, количество: 68, bar_code:, new_record: 0], [размер: S, цена: 0.00, категория:: make:, Модель:, image: https://google.com/dark_blue_jeans.jpg, category_name:, new_record: 0, имя: Dark Blue Jeans, sku:, id: 1588, количество: 0, bar_code:], [размер: XL, цена: 0.00, категория:, make:, Модель:, image: https://google.com/dark_blue_jeans.jpg, category_name:, new_record: 0, имя: Dark Blue Jeans, sku:, id: 1559, количество: 4, bar_code:]]
Обратите внимание, что при нашем отображении, можно также легко создавать allClothes
с flatMap
вместо того, чтобы цикл:
let allClothes = flatMap(json, { $1 })
Таким образом, чтобы заключить, вот наши функции, включенные в класс в качестве примера того, как вы могли бы использовать Это.
class DataManager {
typealias myJSONDic = [String: [[String: AnyObject]]]
func getClothesDictionaryFromJSON(data: NSData) -> myJSONDic? {
if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: nil) as? myJSONDic {
return json
}
return nil
}
func shirtsSizes(json: myJSONDic, category: String) -> [String] {
var shirts = [String]()
if let allShirtsInCategory = json[category] {
for shirt in allShirtsInCategory {
if let id = shirt["id"] as? String, let size = shirt["size"] as? String {
shirts.append("ID \(id) is of size \(size)")
}
}
}
return shirts
}
func getAllClothes(json: myJSONDic) -> [[String: AnyObject]] {
return flatMap(json, { $1 })
}
}
let manager = DataManager()
let clothesDictionary = manager.getClothesDictionaryFromJSON(data!)
let greenShirtsSizes = manager.shirtsSizes(clothesDictionary!, category: "Green Shirt")
let allClothes = manager.getAllClothes(clothesDictionary!)
Обратите внимание, что в этом классе, например, мы создали typealias
для типа нашего словаря, это более удобно читать и писать.
Swift 2 обновление
class DataManager {
typealias myJSONDic = [String: [[String: AnyObject]]]
func getClothesDictionaryFromJSON(data: NSData) -> myJSONDic? {
do {
if let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? myJSONDic {
return json
}
} catch let error as NSError {
print(error)
}
return nil
}
func shirtsSizes(json: myJSONDic, category: String) -> [String] {
var shirts = [String]()
if let allShirtsInCategory = json[category] {
for shirt in allShirtsInCategory {
if let id = shirt["id"] as? String, let size = shirt["size"] as? String {
shirts.append("ID \(id) is of size \(size)")
}
}
}
return shirts
}
func getAllClothes(json: myJSONDic) -> [[String: AnyObject]] {
return json.flatMap { $1 }
}
}
let manager = DataManager()
if let data = data, let clothesDictionary = manager.getClothesDictionaryFromJSON(data) {
let greenShirtsSizes = manager.shirtsSizes(clothesDictionary, category: "Green Shirt")
let allClothes = manager.getAllClothes(clothesDictionary)
print(greenShirtsSizes)
print(allClothes)
}
это для Swift 2.0? –