Получить значение словаря в массиве - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь получить некоторые значения из словаря, который находится в массиве, и я не знаю, как бы я это сделал.Я был в состоянии получить материал из словаря и из массива, но не вместе с ними.Я использую api openweathermap, если это вообще помогает.

Я попытался объединить 2 разных способа, которые я сделал, но это не сработало.Вот что я попробовал:

struct HourlyWeatherAPI: Decoder
{
    let main: Main
    let wind: Wind
    struct Main: Decodable
    {
        let temp: Double
    }
    struct Wind: Decodable
    {
        let speed, deg: Double
    }
}

Это - ^ вверху моего кода, а потом это намного позже

if let tempJson = jsonObject["list"] as? [[String:AnyObject]]
{
    for eachTemp in tempJson
    {
        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase
        let result = try decoder.decode(HourlyWeatherAPI.Main.self, from: data!)
        print(result.temp)
    }
}

Это часть того, что выходит изAPI, только первая запись.Я пытаюсь взять материал в основном:

{
    "cod": "200",
    "message": 0.0197,
    "cnt": 96,
    "list": [
        {
            "dt": 1555196400,
            "main": {
                "temp": 282.26,
                "temp_min": 281.409,
                "temp_max": 282.26,
                "pressure": 1018.06,
                "sea_level": 1018.06,
                "grnd_level": 985.672,
                "humidity": 56,
                "temp_kf": 0.85
            },
            "weather": [
                {
                    "id": 804,
                    "main": "Clouds",
                    "description": "overcast clouds",
                    "icon": "04d"
                }
            ],
            "clouds": {
                "all": 100
            },
            "wind": {
                "speed": 3.99,
                "deg": 313.922
            },
            "sys": {
                "pod": "d"
            },
            "dt_txt": "2019-04-13 23:00:00"
        },

1 Ответ

1 голос
/ 14 апреля 2019

Вы хотите, чтобы ваши структуры данных соответствовали JSON, который вы получаете, начиная с объекта корневого уровня. Затем вы можете декодировать корневой объект и получить доступ к содержащимся структурам данных.

struct Root: Decodable {
     let list:[HourlyWeatherAPI]
}

struct HourlyWeatherAPI: Decodable {
     let main: Main
     let wind: Wind
}

struct Main: Decodable {
    let temp: Double
}

struct Wind: Decodable {
    let speed, deg: Double
}

/* 
 * decode your JSON as before, but use the new Root object as the type. You
 * can then access the hourly weather data from the list property
 */
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let result = try decoder.decode(Root.self, from: data!)
let hourlyWeatherList = result.list
let firstWeatherItem = hourlyWeatherList[0]
let temp = firstWeatherItem.main.temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...