将JSON解析为可用格式

时间:2015-06-18 18:58:16

标签: swift nsarray nsdictionary nsurl

我目前正在从服务器下载数据,我不知道如何获得响应,我正在回到我正在使用的方法所期望的格式。有人可以指导我将JSON响应中的所有项目添加到[[String:AnyObject]]格式中需要做些什么吗?

提前谢谢!!

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
        }
    ]
}

我要做的是拍摄“绿色衬衫”,“深蓝色牛仔裤”和“白色腰带”中的所有物品,并将它们放入[[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 {


}

2 个答案:

答案 0 :(得分:2)

诀窍是为演员声明正确的类型。

对于您的数据,我们使用[String: [[String: AnyObject]]]:一个字符串,其中字符串为键,字典数组为值,这些字典的值为AnyObject,因为有几种可能的类型。

成功解码后,我们打印生成的字典(结果1)。

然后,作为一个例子,我们遍历关键字“Green Shirt”后面的数组中包含的字典,并显示它们的ID和大小。

作为最后一个例子:获取一个包含所有衣服对象的数组。

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,名称:白带,sku:, id:1536,数量:37,bar_code:]],Green Shirt:[[size:XXS,价格:15.00,sku :,名称:Nice Green Shirt,id:740,make:,model:,image:{{3 },category_name :,数量:0,bar_code :, new_record:0],[size:XS,价格:20.00,sku :,名称:Green Shirt,id:743,make:,model:,image:{{3 },category_name :,数量:68,bar_code:,new_record:0]],深蓝色牛仔裤:[[尺码:S,价格:0.00,类别:,品牌:,型号:,图片:https://google.com/green_shirt.jpg, category_name:,new_record:0,name:Dark Blue Jeans,sku:,id:1588,数量:0,bar_code:],[size:XL,price:0.00,category:,make:,model:,image:{{ 3}},category_name:,new_record:0,name:Dark Blue Jeans,sku:,id:1559,数量:4,bar_code:]]]

示例:

  

ID 740的大小为XXS
  ID 743的大小为XS

所有衣服的数组:

  

[[尺寸:均码,价格:0.00,类别:,品牌:,型号:,图片:https://google.com/green_shirt.jpg,category_name:,new_record:0,名称:白带,sku:,id:1536,数量:37,bar_code:],[尺码:XXS,价格:15.00,sku :,名称:Nice Green Shirt,id:740,品牌:,型号:,图片:https://google.com/dark_blue_jeans.jpg,category_name:,数量:0 ,bar_code :, new_record:0],[尺码:XS,价格:20.00,sku :,名称:Green Shirt,id:743,品牌:,型号:,图片:https://google.com/dark_blue_jeans.jpg,category_name:,数量:68 ,bar_code :, new_record:0],[size:S,price:0.00,category:,make:,model:,image:https://google.com/white_belt.jpg,category_name:,new_record:0,name:Dark Blue Jeans,sku: ,id:1588,数量:0,bar_code:],[尺寸:XL,价格:0.00,类别:,品牌:,型号:,图片:https://google.com/green_shirt.jpg,category_name:,new_record:0,名称:深蓝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)
}

答案 1 :(得分: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
    }
}