如何在 swift4 中从复杂的 json 中解析和获取数据?

How to parse and get data from little complicated json in swift4?

我需要帮助来解析名为 weather.json 的 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 文件中获取国家/地区值..? 任何人都可以修复我的代码吗?..

首先,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
}

weatherInfo

中的 local 数组中的国家/地区
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")
}