- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为一个我认为非常简单的问题拔掉头发。我已成功解析 JSON 文件中的数据数组以填充 TableView 和 Collection View ,但我一直在尝试将字典加载到我的模型中。
{
latitude: 42.8821,
longitude: -8.541,
timezone: "Europe/Madrid",
offset: 2,
currently: {
time: 1494674291,
summary: "Drizzle",
icon: "rain",
precipIntensity: 0.1803,
precipProbability: 0.35,
precipType: "rain",
temperature: 14.73,
apparentTemperature: 14.73,
dewPoint: 11.63,
humidity: 0.82,
windSpeed: 7.15,
windBearing: 204,
cloudCover: 0.67,
pressure: 1013.37,
ozone: 378.18
},
我正在尝试访问“当前”字典来填充我的 currentWeather 模型。
import UIKit
import Alamofire
class CurrentWeather {
private var _currentTemp: Double!
private var _date: String!
private var _weatherType: String!
private var _highTemp: Double!
private var _lowTemp: Double!
private var _weatherDesc: String!
var currentTemp: Double {
if _currentTemp == nil {
_currentTemp = 0.0
}
return _currentTemp
}
var date: String {
if _date == nil {
_date = ""
}
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .none
let currentDate = dateFormatter.string(from: Date())
self._date = "Today \(currentDate)"
return _date
}
var weatherType: String {
if _weatherType == nil {
_weatherType = ""
}
return _weatherType
}
var highTemp: Double {
if _highTemp == nil {
_highTemp = 0.0
}
return _highTemp
}
var lowTemp: Double {
if _lowTemp == nil {
_lowTemp = 0.0
}
return _lowTemp
}
var weatherDesc: String {
if _weatherDesc == nil {
_weatherDesc = ""
}
return _weatherDesc
}
init(currentDict: Dictionary<String, AnyObject>) {
if let temperature = currentDict["temperature"] as? Double {
self._currentTemp = temperature
}
if let icon = currentDict["icon"] as? String {
self._weatherType = icon
}
if let summary = currentDict["summary"] as? String {
self._weatherDesc = summary
}
}
}
我的 Alamofire 调用的 VC 代码如下所示 -
import UIKit
import Alamofire
class CityWeatherVC: UIViewController, UITableViewDataSource, UITableViewDelegate, UICollectionViewDelegate, UICollectionViewDataSource {
@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var cityNameLbl: UILabel!
@IBOutlet weak var currentTempLbl: UILabel!
@IBOutlet weak var dateLbl: UILabel!
@IBOutlet weak var currentWeatherImg: UIImageView!
@IBOutlet weak var currentWeatherType: UILabel!
@IBOutlet weak var dayHighTempLbl: UILabel!
@IBOutlet weak var dayLowTempLbl: UILabel!
var currentWeather: CurrentWeather!
var currentWeathers = [CurrentWeather]()
var longRangeForecast: LongRangeForecast!
var longRangeForecasts = [LongRangeForecast]()
var hourlyForecast: HourlyForecast!
var hourlyForecasts = [HourlyForecast]()
private var _segueData: SegueData!
var segueData: SegueData {
get {
return _segueData
} set {
_segueData = newValue
}
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
collectionView.delegate = self
collectionView.dataSource = self
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
downloadApiData {
self.updateCurrentWeatherUI()
}
}
func downloadApiData(completed: DownloadComplete) {
let currentWeatherUrl = URL(string: "\(darkSkyUrl)\(segueData.latitude),\(segueData.longitude)?units=si")!
Alamofire.request(currentWeatherUrl).responseJSON { response in
let result = response.result
if let dict = result.value as? Dictionary<String, AnyObject> {
if let currently = dict["currently"] as? Dictionary<String, AnyObject> {
let current = CurrentWeather(currentDict: currently)
print(current) // ISSUE HERE!
}
if let hourly = dict["hourly"] as? Dictionary<String, AnyObject> {
if let data = hourly["data"] as? [Dictionary<String, AnyObject>] {
for obj in data {
let forecast = HourlyForecast(hourlyDict: obj)
self.hourlyForecasts.append(forecast)
}
self.collectionView.reloadData()
}
}
if let daily = dict["daily"] as? Dictionary<String, AnyObject> {
if let data = daily["data"] as? [Dictionary<String, AnyObject>] {
for obj in data {
let forecast = LongRangeForecast(longWeatherDict: obj)
self.longRangeForecasts.append(forecast)
}
self.longRangeForecasts.remove(at: 0)
self.tableView.reloadData()
}
}
}
}
completed()
}
// tableView - long range forecast
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "longRangeForecastCell", for: indexPath) as? LongRangeForecastCell {
let forecast = longRangeForecasts[indexPath.row]
cell.configureCell(longRangeForecast: forecast)
return cell
} else {
return LongRangeForecastCell()
}
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return longRangeForecasts.count
}
// collectionView - hourly forecast
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "hourlyForecastCell", for: indexPath) as? HourlyForecastCell {
let forecast = hourlyForecasts[indexPath.row]
cell.configureCell(hourlyForecast: forecast)
return cell
} else {
return HourlyForecastCell()
}
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return hourlyForecasts.count
}
func updateCurrentWeatherUI() {
cityNameLbl.text = segueData.cityName
dateLbl.text = currentWeather.date
currentTempLbl.text = "\(currentWeather.currentTemp)"
currentWeatherType.text = currentWeather.weatherDesc
currentWeatherImg.image = UIImage(named: "\(currentWeather.weatherType)L")
dayHighTempLbl.text = "\(Int(currentWeather.highTemp))"
dayLowTempLbl.text = "\(Int(currentWeather.lowTemp))"
}
@IBAction func backButtonPressed(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
}
我有一种感觉,问题与我如何引用它有关,就像我已经处理过的字典数组一样。任何帮助将不胜感激。
更新:收到结果.值。我希望将“当前”字典解析到我的模型中,然后使用模型类中的变量来填充 UI 的当前预测部分。我无法粘贴整个结果,因为帖子允许的字符数较大。
结果值的第二次更新:
["latitude": 42.660851, "timezone": Europe/Madrid, "daily": {
data = (
{
apparentTemperatureMax = "18.33";
apparentTemperatureMaxTime = 1495022400;
apparentTemperatureMin = "10.87";
apparentTemperatureMinTime = 1495054800;
cloudCover = "0.87";
dewPoint = "11.73";
humidity = "0.88";
icon = rain;
moonPhase = "0.7";
ozone = "325.51";
precipIntensity = "0.1753";
precipIntensityMax = "0.3327";
precipIntensityMaxTime = 1495040400;
precipProbability = "0.54";
precipType = rain;
pressure = "1019.68";
最佳答案
首先让我们在任何类之外为 JSON 字典声明一个类型别名
typealias JSONDictionary = [String:Any]
返回的结果 (result.value
) 是一个数组而不是字典(请参阅起始 [
)。
在downloadApiData
中获取数组中第一项的JSON数据,替换
if let dict = result.value as? Dictionary<String, AnyObject> {
与
if let array = result.value as? [JSONDictionary],
let dict = array.first {
现在将dict
传递给初始化器(不是当前
的值)
let current = CurrentWeather(currentDict: dict)
currentTemp
、weatherType
和 weatherDesc
的值位于键currently
的字典中, highTemp
和 lowTemp
位于字典 daily
数组 data
的第一个字典中。
您的类 CurrentWeather
– 从私有(private)支持变量中解放出来 – 是
class CurrentWeather {
let currentTemp: Double
let weatherType: String
let highTemp: Double
let lowTemp: Double
let weatherDesc: String
var date: String {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .none
let currentDate = dateFormatter.string(from: Date())
return "Today \(currentDate)"
}
init(currentDict: JSONDictionary) {
if let currently = currentDict["currently"] as? JSONDictionary {
self.currentTemp = currently["temperature"] as? Double ?? 0.0
self.weatherType = currently["icon"] as? String ?? "n/a"
self.weatherDesc = currently["summary"] as? String ?? "n/a"
} else {
self.currentTemp = 0.0
self.weatherType = "n/a"
self.weatherDesc = "n/a"
}
if let daily = currentDict["daily"] as? JSONDictionary,
let data = daily["data"] as? [JSONDictionary],
let firstDailyDict = data.first {
self.highTemp = firstDailyDict["temperatureMax"] as? Double ?? 0.0
self.lowTemp = firstDailyDict["temperatureMin"] as? Double ?? 0.0
} else {
self.highTemp = 0.0
self.lowTemp = 0.0
}
}
}
关于json - Swift:使用 Alamofire 访问 JSON 中的字典和模型中的私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43956764/
最近开始学习MongoDB。今天老师教了我们 mongoexport 命令。在练习时,我遇到了一个典型的问题,包括教练在内的其他同学都没有遇到过。我在我的 Windows 10 机器上使用 Mongo
我是 JSON Schema 的新手,读过什么是 JSON Schema 等等。但我不知道如何将 JSON Schema 链接到 JSON 以针对该 JSON Schema 进行验证。谁能解释一下?
在 xml 中,我可以在另一个 xml 文件中包含一个文件并使用它。如果您的软件从 xml 获取配置文件但没有任何方法来分离配置,如 apache/ngnix(nginx.conf - site-av
我有一个 JSON 对象,其中包含一个本身是 JSON 对象的字符串。我如何反序列化它? 我希望能够做类似的事情: #[derive(Deserialize)] struct B { c: S
考虑以下 JSON { "a": "{\"b\": 12, \"c\": \"test\"}" } 我想定义一个泛型读取 Reads[Outer[T]]对于这种序列化的 Json import
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 11 个月前关闭。 Improve
我的旧项目在 MySQL 中有 Standard JSON 格式的数据。 对于我在 JS (Node.js) 和 DynamoDB 中的全新项目,关于 Standard JSON格式: 是否建议将其转
JSON 值字符串、数字、true、false、null 是否是有效的 JSON? 即,是 true 一个有效的 JSON 文档?还是必须是数组/对象? 一些验证器接受这个(例如 http://jso
我有一个 JSON 字符串,其中一个字段是文本字段。这个文本字段可以包含用户在 UI 中输入的文本,如果他们输入的文本是 JSON 文本,也许是为了说明一些编码,我需要对他们的文本进行编码,以便它不会
我正在通过 IBM MQ 调用处理数据,当由 ColdFusion 10 (10,0,11,285437) 序列化时,0 将作为 +0.0 返回,它会导致无效的 JSON并且无法反序列化。 stPol
我正在从三个数组中生成一个散列,然后尝试构建一个 json。我通过 json object has array 成功了。 require 'json' A = [['A1', 'A2', 'A3'],
我从 API 接收 JSON,响应可以是 30 种类型之一。每种类型都有一组唯一的字段,但所有响应都有一个字段 type 说明它是哪种类型。 我的方法是使用serde .我为每种响应类型创建一个结构并
我正在下载一个 JSON 文件,我已将其检查为带有“https://jsonlint.com”的有效 JSON 到文档目录。然后我打开文件并再次检查,结果显示为无效的 JSON。这怎么可能????这是
我正在尝试根据从 API 接收到的数据动态创建一个 JSON 对象。 收到的示例数据:将数据解码到下面给出的 CiItems 结构中 { "class_name": "test", "
我想从字符串转换为对象。 来自 {"key1": "{\n \"key2\": \"value2\",\n \"key3\": {\n \"key4\": \"value4\"\n }\n
目前我正在使用以下代码将嵌套的 json 转换为扁平化的 json: import ( "fmt" "github.com/nytlabs/gojsonexplode" ) func
我有一个使用来自第三方 API 的数据的应用程序。我需要将 json 解码为一个结构,这需要该结构具有“传入”json 字段的 json 标签。传出的 json 字段具有不同的命名约定,因此我需要不同
我想使用 JSON 架构来验证某些值。我有两个对象,称它们为 trackedItems 和 trackedItemGroups。 trackedItemGroups 是组名称和 trackedItem
考虑以下案例类模式, case class Y (a: String, b: String) case class X (dummy: String, b: Y) 字段b是可选的,我的一些数据集没有字
我正在存储 cat ~/path/to/file/blah | 的输出jq tojson 在一个变量中,稍后在带有 JSON 内容的 curl POST 中使用。它运作良好,但它删除了所有换行符。我知
我是一名优秀的程序员,十分优秀!