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