Как разобрать и получить данные из небольшого сложного JSON в Swift4? - PullRequest
0 голосов
/ 01 декабря 2018

Мне нужна помощь с анализом файла json с именем weather.json.
weather.json

{
  "weatherinfo": {
        "local": [
          {
            "country": "Korea",
            "weather": "rainy",
            "temperature": "20"
          },
          {
            "country": "US",
            "weather": "sunny",
            "temperature": "30"
          }
        ]
  }
}

А вот мой код

struct Weather: Decodable {
    var weatherInfo: WeatherInfo?
}

struct WeatherInfo: Decodable {
    let local: [Local]?
}

struct Local: Decodable {
    let country: String?
    let weather: String?
    let temperature: String?
}

внутри func viewDidLoad() in UIViewController

let decoder = JSONDecoder()
guard let path: String = Bundle.main.path( forResource: "weather", ofType: "json") else { return }
let jsonURL = URL(fileURLWithPath: path)
URLSession.shared.dataTask(with: jsonURL) { (data, response, error) in
    guard let data = data else { return }
    print("pass1")
    do {
        let weather = try decoder.decode(Weather.self, from: data)
        print("parsing pass..")
        print(weather)  // Weather(weatherInfo: nil)
        print(weather.weatherInfo?.local?[0].country)  // nil
    } catch let jsonErr{
        print("Error: \(jsonErr)")
    }
}.resume()

Мне удалось выполнить синтаксический анализ, но я не могу получить данные по погодной константе ..
Как я могу получить значение страны из этого файла json ..?Кто-нибудь может исправить мой код, пожалуйста? ..

1 Ответ

0 голосов
/ 01 декабря 2018

Прежде всего URLSession для чтения файла в комплекте - это перебор.Просто получите Data.

Во-вторых, объявляйте все необязательными, поскольку вы четко знаете, что все ключи доступны

struct Weather: Decodable {
    let weatherinfo: WeatherInfo // note the lowercase spelling
}

struct WeatherInfo: Decodable {
    let local: [Local]
}

struct Local: Decodable {
    let country: String
    let weather: String
    let temperature: String
}

Страны находятся в массиве local in weatherInfo

let url = Bundle.main.url(forResource: "weather", withExtension: "json")!
let data = try! Data(contentsOf: url)
let result = try! JSONDecoder().decode(Weather.self, from: data)
for location in result.weatherinfo.local {
    print("In \(location.country) the weather is \(location.weather) and the temperature is \(location.temperature) degrees")
}
...