using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public class CityTemperature
public string name{get;set;}
public string state{get;set;}
public string id {get;set;}
public string zipcode {get;set;}
public Dictionary <DateTime, AverageDayTemperature > avgDateTempDic {get;set;}
public CityTemperature(JObject json)
name = json["city"]["name"].ToString();
id = json["city"]["id"].ToString();
zipcode = GetZipCode(json["city"]["coord"]["lat"].ToString(), json["city"]["coord"]["lon"].ToString());
DayTemperature [] dates = JsonConvert.DeserializeObject<DayTemperature[]>(json["list"].ToString());
avgDateTempDic = new Dictionary< DateTime, AverageDayTemperature>();
foreach (DayTemperature dayTemp in dates){
DateTime fullDate = new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);
fullDate = fullDate.AddSeconds( dayTemp.dt).ToLocalTime();
DateTime date = fullDate.Date;
if( avgDateTempDic.ContainsKey( date ) ){
AverageDayTemperature avgDayTemp = avgDateTempDic[date];
avgDayTemp.temperature = (avgDayTemp.temperature + dayTemp.main.temp)/2;
if(avgDayTemp.rain == false){
avgDayTemp.rain = (dayTemp.weather[0].main).Equals("Rain") ? true : false;
AverageDayTemperature temp = new AverageDayTemperature();
temp.temperature = dayTemp.main.temp;
temp.rain = (dayTemp.weather[0].main).Equals("Rain") ? true : false;
avgDateTempDic.Add(date, temp);
string GetZipCode(string lat, string lng)
var xml = new XmlDocument();
xml.Load("https://maps.googleapis.com/maps/api/geocode/xml?latlng=" + lat + "," + lng +"&sensor=true");
var components = xml["GeocodeResponse"]["result"].ChildNodes;
foreach (XmlElement x in components)
Console.WriteLine(x.ToString());
if (x.Name == "address_component" && x["type"].InnerText == "postal_code")
postalCode = x["long_name"].InnerText;
public Main main{get;set;}
public List <Weather> weather{get;set;}
public string main{get;set;}
public double temp{get;set;}
public class AverageDayTemperature{
public double temperature{get;set;}
public bool rain{get;set;}
private static List <CityTemperature> citiesTemperatures = new List<CityTemperature>();
public static void apiCall()
Dictionary <string,string> cities = new Dictionary <string, string>(){
{"Marlboro","MA"},{"San Diego","CA"},{"Cheyenne","WY"},
{"Anchorage","AK"},{"Austin","TX"},{"Orlando", "FL"},
{"Seattle","WA"}, {"Cleveland","OH"}, {"Portland","ME"},
foreach (KeyValuePair <string,string> city in cities)
string url = "https://api.openweathermap.org/data/2.5/forecast?q=" + city.Key + ",us";
WebClient client = new WebClient();
string data = client.DownloadString(url);
JObject cityJson = JObject.Parse(data);
CityTemperature cityTemperature = new CityTemperature(cityJson);
cityTemperature.state = city.Value;
citiesTemperatures.Add(cityTemperature);
Console.WriteLine(ex.Message);
if (ex.Status == WebExceptionStatus.ProtocolError)
Console.WriteLine("Status Code : {0}", ((HttpWebResponse)ex.Response).StatusCode);
Console.WriteLine("Status Description : {0}", ((HttpWebResponse)ex.Response).StatusDescription);
Console.WriteLine(e.Message);
public static void displayDailyTemperature(){
foreach (CityTemperature city in citiesTemperatures){
Console.WriteLine("___________________________");
Console.WriteLine("{0}, {1} ({2})",city.name, city.state,city.zipcode);
Console.WriteLine("Date \t\t\t Avg Temp(F)");
Console.WriteLine("---------------------------");
foreach(KeyValuePair<DateTime, AverageDayTemperature> item in city.avgDateTempDic){
double temp = 9/5*(item.Value.temperature - 273.15)+ 32;
Console.WriteLine("{0}{1} \t\t {2} F", item.Key.ToString("d"), item.Value.rain == false ? "" : "*", Math.Round(temp, 2, MidpointRounding.AwayFromZero));
public static void Main()
displayDailyTemperature();