可编码 Swift JSON 解析嵌套 JSON

noo*_*obs 4 json swift4

我的 JSON 数据如下所示

\n\n
{\n    "latitude": 34.088051,\n    "longitude": -118.296512,\n    "timezone": "America/Los_Angeles",\n    "daily": {\n        "summary": "No precipitation throughout the week, with high temperatures rising to 92\xc2\xb0F on Friday.",\n        "icon": "clear-day",\n        "data": [\n            {\n                "time": 1535266800,\n                "summary": "Mostly cloudy in the morning.",\n                "icon": "partly-cloudy-day",\n                "sunriseTime": 1535289854,\n                "sunsetTime": 1535336915,\n                "moonPhase": 0.51}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想从中提取时间、摘要、图标。

\n\n

我创建了一个 WeatherObject 类型的类,但这就是我陷入困境的地方。如何创建结构?这些键不是蛇形的,也不是错误命名的,所以我想我可以在不使用枚举来重命名变量名的情况下逃脱。

\n\n

编辑:做 - 抓住跌倒去抓住。VC 实现协议。传递给协议方法的数据在方法实现中打印,但在 do 子句中无法处理。

\n\n
protocol NetworkingDelegate: AnyObject {\n    func didGetResult(data: Data?) -> Void\n}\n\n\nclass Networking: NSObject {\n\n    var data: Data?\n    weak var delegate: NetworkingDelegate?\n\n    func makeAPIRequest(apiString: String) -> Void {\n        guard let url: URL = URL(string: apiString) else{\n            print("ERROR no URL")\n            return\n        }\n\n        let urlRequest = URLRequest(url: url)\n\n        let dataSession = URLSession.shared\n        let dataTask = dataSession.dataTask(with: urlRequest) { (data, response, error) in\n\n            guard error == nil else{\n                print("ERROR found in networking call")\n                print(error!)\n                return\n            }\n\n            if data != nil{\n\n                print("Data exists in networking")\n                self.delegate?.didGetResult(data: data!)\n\n\n\n\n            }else{\n                print("ERROR: did not receive data")\n            }\n        }\n\n        dataTask.resume()\n    }\n\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在视图控制器中

\n\n
  func didGetResult(data: Data?) {\n\n\n\n            do {\n\n                if let dataObject = data{\n\n                    let theString:NSString = NSString(data: dataObject, encoding: String.Encoding.ascii.rawValue)!\n                    print(theString)\n                }\n                let newJSONDecoder = JSONDecoder()\n                let weatherObject = try newJSONDecoder.decode(WeatherObj.self, from:data!)\n                let dailyObject = weatherObject.daily\n                let dataArray = dailyObject.data\n                //LOOP THROUGH dataArray and get the required info\n                for val in dataArray {\n                    print("=======")\n                    print(val.time)\n                    print(val.summary)\n                    print(val.icon)\n                    print("=======")\n                }\n            } catch {\n                print("error while parsing:\\(error.localizedDescription)")\n            }\n\n\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

Bha*_*ara 5

您可以像这样创建结构

struct WeatherObject: Codable {
  let latitude: Double
  let longitude: Double
  let timezone: String
  let daily: Daily
}

struct Daily: Codable {
    let summary: String 
    let icon: String
    let data: [Datum]
}

struct Datum: Codable {
    let time: Int
    let summary: String
    let icon: String
    let sunriseTime: Int
    let sunsetTime: Int
    let moonPhase: Double
}
Run Code Online (Sandbox Code Playgroud)

然后就可以解析它并获取所需的信息

do {
    let newJSONDecoder = JSONDecoder()
    let weatherObject = try newJSONDecoder.decode(WeatherObject.self, from: jsonData)
    let dailyObject = weatherObject.daily
    let dataArray = dailyObject.data
    //LOOP THROUGH dataArray and get the required info
    for val in dataArray {
        print("=======")
        print(val.time)
        print(val.summary)
        print(val.icon)
        print("=======")
    }
} catch {
    print("error while parsing:\(error.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你