WeatherData.fromJson constructor
//////////// //////////// Creates WeatherData from OpenWeatherMap API JSON response
Implementation
// II.C - Factory Methods
///////////////
/// Creates WeatherData from OpenWeatherMap API JSON response
factory WeatherData.fromJson(Map<String, dynamic> json) {
try {
// Extract precipitation (rain or snow)
double precipitation = 0.0;
if (json.containsKey('rain')) {
final rainData = json['rain'];
precipitation += rainData is Map ?
(rainData['1h'] as num?)?.toDouble() ?? 0.0 : 0.0;
}
if (json.containsKey('snow')) {
final snowData = json['snow'];
precipitation += snowData is Map ?
(snowData['1h'] as num?)?.toDouble() ?? 0.0 : 0.0;
}
// Extract main weather data
final main = json['main'] ?? {};
final weather = (json['weather'] as List?)?.isNotEmpty == true
? json['weather'][0]
: {};
final visibilityData = json['visibility'] as num?;
final wind = json['wind'] ?? {};
return WeatherData(
precipitation: precipitation,
temperature: (main['temp'] as num?)?.toDouble() ?? 0.0,
humidity: (main['humidity'] as num?)?.toInt() ?? 0,
description: (weather['description'] as String?) ?? 'Unknown',
iconCode: (weather['icon'] as String?) ?? '01d',
visibility: visibilityData != null ? (visibilityData / 1000).toDouble() : 10.0, // Convert to km
windSpeed: (wind['speed'] as num?)?.toDouble() ?? 0.0,
windDirection: (wind['deg'] as num?)?.toDouble() ?? 0.0,
pressure: (main['pressure'] as num?)?.toDouble() ?? 1013.0,
uvIndex: (json['uvi'] as num?)?.toDouble() ?? 0.0,
);
} catch (e) {
print('Error parsing weather data: $e');
return WeatherData(
precipitation: 0.0,
temperature: 0.0,
humidity: 0,
description: 'Error',
iconCode: '01d',
visibility: 10.0,
windSpeed: 0.0,
windDirection: 0.0,
pressure: 1013.0,
uvIndex: 0.0,
);
}
}