我有以下JSON:
// Benefit with angles outside -360° to +360°
float angle_degrees_reduce = fmodf(angle_degrees, 360.0f);
float angle_radians = angle_degrees_reduce * M_PI/180.0;
我正在以下列方式收集它(在一个函数内)(为简单起见,删除了保护措施):
{
"stores":2,
"store_data":[
{
"store_id":1,
"store_name":"Target"
"store_color":"000000"
},
{
"store_id":2,
"store_name":"Walmart"
"store_color":"FFFFFF"
}
]
}
并将其发送到辅助进程函数,定义为:
let task = URLSession.shared.dataTask(with: baseURL) { (data, response, error) in
if let tmpRawData: NSDictionary = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary {
process(rawData: tmpRawData)
}
}
我在上面的函数中循环遍历数组时遇到了一些麻烦。最初,我曾尝试过:
func process(rawData: NSDictionary) -> Bool {
if let storeDataArray = rawData["store_data"] {
// Here I want to loop through the store_data array
}
}
但我是swift的新手,在NSArray,Array,Dictionary,NSDictionary等之间解密时遇到问题。我在Swift 3工作。非常感谢任何帮助!
答案 0 :(得分:0)
首先,不要那么多注释类型。编译器会告诉您它是否需要显式注释
其次,为JSON字典声明类型别名很方便
typealias JSONObject = [String:Any]
这是任务,tmpRawData
是一个字典 - 由JSON中的{}
表示。
let task = URLSession.shared.dataTask(with: baseURL) { (data, response, error) in
if let tmpRawData = try JSONSerialization.jsonObject(with: data, options: []) as! JSONObject {
process(rawData: tmpRawData)
}
}
和process
函数,类型别名使一切更具可读性
rawData
的值是一个字典数组 - 在JSON中由[]
表示。
func process(rawData: JSONObject) -> Bool {
if let storeDataArray = rawData["store_data"] as? [JSONObject] {
for store in storeDataArray {
let storeID = store["store_id"] as! Int
let storeName = store["store_name"] as! String
let storeColor = store["store_color"] as! String
print(storeID, storeName, storeColor)
}
}
}
我不知道为什么所有教程都建议使用mutableContainers
选项。在使用本机集合类型时,您根本不需要它。