实际上,您得到的响应是[String : [[String : String]]] 类型的字典。所以"report_data"键的value是[[String : String]]类型的数组。
现在[[String : String]] 实际上是一个字典数组。因此,数组的每个元素都是一个字典,即 [String : String],您的 "name" 键所在的位置。
let responseDictionary: [String : Any] = [ "report_data" : [
["name":"Total Days","value":"7"],
["name":"Present Days","value":"0"],
["name":"Total Hours","value":".0"],
["name":"Average Hours","value":".0"],
["name":"Start Date","value":"2018-05-14"],
["name":"End Date","value":"2018-05-20"]
] ]
if let arrayOfDictionary = responseDictionary["report_data"] as? [[String : String]] {
for dictionary in arrayOfDictionary {
if let name = dictionary["name"] {
print(name)
}
}
}
好吧,for dictionary in arrayOfDictionary 给了你错误,因为当你得到它时,你的回复实际上是 [String : Any] 类型。但是当值是Any 类型时,您不能执行太多操作。因此,您需要将 Any 转换为显式类型才能拥有具体对象。您需要先将 Any 类型数组转换为实际的 [[String : String]] 类型数组。
编辑:
您注定要使用格式错误的 JSON。这就是你遇到麻烦的原因。下面一起来看看Dictionary到JSON的处理方法:
let responseDictionary: [String : Any] = [ "content": "",
"subject": "Weekly Attendance 2018-05-14 - 2018-05-20",
"attachments": "[]",
"report_data" : [
["name":"Total Days","value":"7"],
["name":"Present Days","value":"0"],
["name":"Total Hours","value":".0"],
["name":"Average Hours","value":".0"],
["name":"Start Date","value":"2018-05-14"],
["name":"End Date","value":"2018-05-20"]
],
"asset_reference": "[]",
"activity_reference": "[]",
"form_approval_field_reference": "[]"
]
您可能已将此字典转换为 JSON,然后转换为 JSON 字符串。但在此过程中,您丢失了 JSON 标准格式。这应该怎么做:
var text: String = ""
do {
let jsonData = try JSONSerialization.data(withJSONObject: responseDictionary, options: .prettyPrinted)
text = String(data: jsonData, encoding: .utf8) ?? ""
} catch {
print(error.localizedDescription)
}
现在,如果您的 text 是一个有效的 JSON 字符串,那么您就可以开始了:
if let data = text.data(using: .utf8) {
do {
let response = try JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]
if let response = response, let arrayOfDictionary = response["report_data"] as? [[String : String]] {
for dictionary in arrayOfDictionary {
if let name = dictionary["name"] {
print(name)
}
}
}
} catch {
print(error.localizedDescription)
}
}