2015-06-18 5 views
1

В настоящее время я загружаю данные с сервера, и я не уверен, как получить ответ, который я возвращаю в формат, ожидаемый с помощью метода, с которым я работаю. Может ли кто-нибудь направить меня на то, что мне нужно сделать, чтобы все элементы в ответе JSON были добавлены в формат [[String: AnyObject]]?Разбор JSON в полезном формате

Благодарим вас заранее!

JSON, что я получаю обратно

{ 
    "Green Shirt": [ 
     { 
      "id": "740", 
      "name": “Nice Green Shirt", 
      "quantity": "0", 
      "make": "", 
      "model": "", 
      "price": “15.00", 
      "size": "XXS", 
      "sku": null, 
      "image": "https:\/\/google.com\/green_shirt.jpg", 
      "new_record": false, 
      "category_name": "", 
      "bar_code": "", 
     }, 
     { 
      "id": "743", 
      "name": "Green Shirt", 
      "quantity": “68", 
      "make": "", 
      "model": "", 
      "price": “20.00", 
      "size": "XS", 
      "sku": null, 
      "image": "https:\/\/google.com\/green_shirt.jpg", 
      "new_record": false, 
      "category_name": "", 
      "bar_code": "", 
     } 
    ], 
    "Dark Blue Jeans": [ 
     { 
      "id": "1588", 
      "name": "Dark Blue Jeans", 
      "quantity": "0", 
      "make": "", 
      "model": "", 
      "price": "0.00", 
      "size": “S", 
      "sku": null, 
      "image": "https:\/\/google.com\/dark_blue_jeans.jpg", 
      "new_record": false, 
      "category_name": "", 
      "bar_code": "", 
      "category": null 
     }, 
     { 
      "id": "1559", 
      "name": "Dark Blue Jeans", 
      "quantity": "4", 
      "make": "", 
      "model": "", 
      "price": "0.00", 
      "size": “XL", 
      "sku": null, 
      "image": "https:\/\/google.com\/dark_blue_jeans.jpg", 
      "new_record": false, 
      "category_name": "", 
      "bar_code": "", 
      "category": null 
     } 
    ], 
    "White Belt": [ 
     { 
      "id": "1536", 
      "name": "White Belt", 
      "quantity": "37", 
      "make": "", 
      "model": "", 
      "price": "0.00", 
      "size": "One Size", 
      "sku": null, 
      "image": "https:\/\/google.com\/white_belt.jpg", 
      "new_record": false, 
      "category_name": "", 
      "bar_code": "", 
      "category": null 
     } 
    ] 
} 

Что я пытаюсь сделать, это все элементы в «зеленой рубашке», «Dark Blue Jeans» и «Белый пояс» и поместить их в этот формат [[String: AnyObject]]

// 1 - Make the HTTP Request 
var endpoint = NSURL(string: "https://www.mycustomsite.com/get-inventory") 
var data = NSData(contentsOfURL: endpoint!) 


// 2 - Validate and Deserialize the response 

if let json: NSDictionary = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary { 


} 
+0

это для Swift 2.0? –

ответ

2

Трюк состоит в том, чтобы объявить правильный тип для броска.

Для ваших данных мы используем [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) 
} 
+0

Спасибо, тонна! Я многому учусь, и я уверен, что вы только что сохранили мою работу. –

0

что-то вдоль этих линий будет анализировать отдельные элементы в массив словарей для вас:

var items: [[String: AnyObject]] = [] //Create new array 
for key in json.keys { 
    let group = json[key] as! [[String: AnyObject]] //Get array such as "Green Shirt" 

    for item in group { 
     items.append(item) //Loop through items and add to new array 
    } 
} 
Смежные вопросы