На самом деле вы получаете ответ в виде словаря типа [String : [[String : String]]]
.Таким образом, ключ value
из "report_data"
является массивом типа [[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)
}
}