Ниже, во второй половине этого ответа, я опишу, в чем проблема в вашем фрагменте кода. Но вы используете Swift, поэтому вам вообще не следует использовать NSDictionary
и NSArray
. Вы должны использовать JSONDecoder
для анализа json и иметь дело исключительно с объектами Swift.
Таким образом, вы можете определить такие структуры следующим образом:
struct WeatherReport: Decodable {
let id: Int
let main: String
}
struct ResponseObject : Decodable {
let weather: [WeatherReport]
}
И декодировать это так:
do {
let responseObject = try JSONDecoder().decode(ResponseObject.self, from: data)
for weatherReport in responseObject.weather {
print(weatherReport.id)
}
} catch {
print(error)
}
Теперь мое определение WeatherReport
, несомненно, неверно, поскольку оно должно соответствовать вашей структуре JSON, которой вы с нами не поделились. Например, я предполагаю, что ваши значения id
являются цифрами c (без кавычек; мы не можем определить это, посмотрев на ваш вывод). Также вам следует проверить документацию и выяснить, как выглядит JSON в случае ошибки. Так что вы должны это проверить. Но, надеюсь, это иллюстрирует идею.
Относительно того, почему вы видите (
и )
вокруг ваших значений, это потому, что объекты, которые вы печатаете, сами по себе являются NSArray
объектами. Когда вы вызываете value(forKey:)
для NSArray
из NSDictionary
объектов, он будет go через массив и захватывать значение, связанное с этим ключом для каждого словаря в вашем массиве, и будет возвращать массив значений. Отсюда (
и )
на выходе. Конечно, ваш «массив словарей» в настоящее время содержит только один словарь, но тот факт, что это массив, позволяет предположить, что weather
может содержать несколько словарей.
Учитывайте это чрезмерное упрощенная версия вашего JSON:
{
"weather": [
{
"id": 42,
"main": "Rain"
},
{
"id": 520
"main": "Cloudy"
}
]
}
Таким образом
if let weather = jsonObj.value(forKey: "weather") as? NSArray {
let identifiers = weather.value(forKey: "id")
print (identifiers)
}
будет выводить
(
42,
520
)
Теперь, ваш массив словарей, очевидно, имеет только один словарь в этот момент, но это иллюстрирует, что происходит.
Если вы не хотите скобки, получите firstObject
из массива:
guard
let weather = jsonObj.value(forKey: "weather") as? NSArray,
let weatherReport = weather.firstObject as? NSDictionary
else {
return
}
if let idObject = weatherReport.value(forKey: "id") as? Int {
print(idObject)
}
Или, если вы хотите напечатать все они:
guard
let weather = jsonObj.value(forKey: "weather") as? NSArray
else {
return
}
for object in array {
if let weatherReport = weather as? NSDictionary, let identifier = weatherReport["id"] as? Int {
print(identifier)
}
}
Вот как можно перемещаться по NSArray
из NSDictionary
объектов. Но, как описано в начале моего ответа, вы не должны использовать эти NS
типы вообще. Получите ваш необработанный Data
и декодируйте его для типов объектов модели, используя вместо этого JSONDecoder
.