将 JSON 解析为可用格式

Parsing JSON into a usable format

我目前正在从服务器下载数据,但我不确定如何获得响应以返回我正在使用的方法所期望的格式。有人可以指导我如何将 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
        }
    ]
}

我想做的是将 "Green Shirt"、"Dark Blue Jeans" 和 "White Belt" 中的所有项目放入 [[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 {


}

沿着这些路线的东西会为您将单个项目解析为字典数组:

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

诀窍是为转换声明正确的类型。

对于您的数据,我们使用 [String: [[String: AnyObject]]]:一个以 String 作为键并以字典数组作为值的字典,这些字典的值为 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:

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

示例:

ID 740 is of size XXS
ID 743 is of size XS

所有衣服的排列:

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

请注意,使用我们的映射,我们还可以轻松地使用 flatMap 创建 allClothes 而不是创建循环:

let allClothes = flatMap(json, {  })

因此,总而言之,这里是 class 中包含的函数,作为您如何使用它的示例。

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, {  })
    }

}

let manager = DataManager()
let clothesDictionary = manager.getClothesDictionaryFromJSON(data!)
let greenShirtsSizes = manager.shirtsSizes(clothesDictionary!, category: "Green Shirt")
let allClothes = manager.getAllClothes(clothesDictionary!)

请注意,在这个class示例中,我们为我们的字典类型创建了一个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 {  }
    }

}

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