我的 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}\nRun Code Online (Sandbox Code Playgroud)\n\n我想从中提取时间、摘要、图标。
\n\n我创建了一个 WeatherObject 类型的类,但这就是我陷入困境的地方。如何创建结构?这些键不是蛇形的,也不是错误命名的,所以我想我可以在不使用枚举来重命名变量名的情况下逃脱。
\n\n编辑:做 - 抓住跌倒去抓住。VC 实现协议。传递给协议方法的数据在方法实现中打印,但在 do 子句中无法处理。
\n\nprotocol 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}\nRun 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 }\nRun Code Online (Sandbox Code Playgroud)\n
您可以像这样创建结构
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)
希望能帮助到你
| 归档时间: |
|
| 查看次数: |
2764 次 |
| 最近记录: |