using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
WebClient wc = new WebClient();
string json = wc.DownloadString("http://samples.openweathermap.org/data/2.5/forecast?q=London,us&appid=b6907d289e10d714a6e88b30761fae22");
var root = JsonConvert.DeserializeObject<WeatherForecast>(json);
Console.WriteLine(string.Format("Weather for {0} (lat {1}, lon {2}):",
root.City.name, root.City.coord.lat, root.City.coord.lon));
Console.WriteLine("Date and Time Pressure Humidity Clouds Rain Snow");
Console.WriteLine("---------------------- -------- -------- ------ ------ ------");
foreach (var ci in root.ClimateIndicators)
Atmospheric atm = ci.Atmospheric;
Console.WriteLine(string.Format("{0,-22} {1,8:#.00} {2,8} {3,6} {4,6:#0.00} {5,6:#0.00}",
ci.Date, atm.Pressure, atm.Humidity, atm.Cloudiness, atm.Rain, atm.Snow));
public class WeatherForecast
public City City { get; set; }
public IList<ClimateIndicators> ClimateIndicators { get; set; }
public int id { get; set; }
public string name { get; set; }
public Coord coord { get; set; }
public string country { get; set; }
public double lat { get; set; }
public double lon { get; set; }
[JsonConverter(typeof(ClimateIndicatorsConverter))]
public class ClimateIndicators
public Atmospheric Atmospheric { get; set; }
public DateTime Date { get; set; }
public double Pressure { get; set; }
public int Humidity { get; set; }
public double SeaLevel { get; set; }
public double GroundLevel { get; set; }
public int Cloudiness { get; set; }
public double? Rain { get; set; }
public double? Snow { get; set; }
class ClimateIndicatorsConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(ClimateIndicators);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject obj = JObject.Load(reader);
Atmospheric atm = new Atmospheric();
atm.Pressure = (double)obj.SelectToken("main.pressure");
atm.Humidity = (int)obj.SelectToken("main.humidity");
atm.SeaLevel = (double)obj.SelectToken("main.sea_level");
atm.GroundLevel = (double)obj.SelectToken("main.grnd_level");
atm.Cloudiness = (int)obj.SelectToken("clouds.all");
atm.Rain = (double?)obj.SelectToken("rain.3h");
atm.Snow = (double?)obj.SelectToken("snow.3h");
ClimateIndicators indicators = new ClimateIndicators();
indicators.Atmospheric = atm;
indicators.Date = (DateTime)obj.SelectToken("dt_txt");
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();