2013-12-25 2 views
3

С Рождеством! Я пытаюсь разобрать JSON из API погоды Wunderground, и я столкнулся с проблемой при попытке присвоить значения переменным. Here - это ссылка на JSON. Просто знайте, что структура класса, которую я предоставляю, является конгломератом, чтобы разместить несколько структур возвратных файлов JSON. Я дам класс structre, затем вызов из main и, наконец, фактический метод с отмеченной ошибкой. Я работаю в Xamarin, ранее MonoDevelop. Спасибо за все, что вы можете придумать!Ошибка разбора JSON с NewtonSoft

Ошибка гласит: Newtonsoft.Json.JsonReaderException была выброшена «Невозможно преобразовать строку в Integer: 5.0 Путь 'current_observation.wind_gust_mph', строка 60, позиция 24.

public class Wunder 
{ 

    //constructor 
    public Wunder() 
    { 

    } 

    //JSON classes 
    public class HistoryResponseContainer 
    { 
     public ResponseInfo response { get; set; } 
     public HistoryInfo history { get; set; } 
     public Location location { get; set; } 
     public CurrentObservation current_observation { get; set; } 
    } 

    public class ResponseInfo 
    { 
     public string version { get; set; } 
     public string termsofService { get; set; } 
     public Dictionary<string, int> features { get; set; } 
    } 

    public class HistoryInfo 
    { 
     public WUDate date { get; set; } 
     public WUDate utcdate { get; set; } 
     public Observation[] observations { get; set; } 
     public Dailysummary[] dailysummary { get; set; } 
    } 

    public class WUDate 
    { 
     public string pretty { get; set; } 
     public string year { get; set; } 
     public string mon { get; set; } 
     public string mday { get; set; } 
     public string hour { get; set; } 
     public string min { get; set; } 
     public string tzname { get; set; } 

     public DateTime Value 
     { 
      get 
      { 
       int year = int.Parse(this.year); 
       int month = int.Parse(this.mon); 
       int day = int.Parse(this.mday); 
       int hour = int.Parse(this.hour); 
       int minute = int.Parse(this.min); 

       var kind = this.tzname == "UTC" 
          ? DateTimeKind.Utc 
          : DateTimeKind.Unspecified; 

       return new DateTime(year, month, day, hour, minute, 0, kind); 
      } 
     } 
    } 

    public class Observation 
    { 
     public WUDate date { get; set; } 
     public WUDate utcdate { get; set; } 
     public string tempm { get; set; } 
     public string tempi { get; set; } 
     public string dewptm { get; set; } 
     public string dewpti { get; set; } 
     public string hum { get; set; } 
     public string wspdm { get; set; } 
     public string wspdi { get; set; } 
     public string wgustm { get; set; } 
     public string wgusti { get; set; } 
     public string wdird { get; set; } 
     public string wdire { get; set; } 
     public string vism { get; set; } 
     public string visi { get; set; } 
     public string pressurem { get; set; } 
     public string pressurei { get; set; } 
     public string windchillm { get; set; } 
     public string windchilli { get; set; } 
     public string heatindexm { get; set; } 
     public string heatindexi { get; set; } 
     public string precipm { get; set; } 
     public string precipi { get; set; } 
     public string conds { get; set; } 
     public string icon { get; set; } 
     public string fog { get; set; } 
     public string rain { get; set; } 
     public string snow { get; set; } 
     public string hail { get; set; } 
     public string thunder { get; set; } 
     public string tornado { get; set; } 
     public string metar { get; set; } 
    } 

    public class Dailysummary 
    { 
     public WUDate date { get; set; } 
     public string fog { get; set; } 
     public string rain { get; set; } 
     public string snow { get; set; } 
     public string snowfallm { get; set; } 
     public string snowfalli { get; set; } 
     public string monthtodatesnowfallm { get; set; } 
     public string monthtodatesnowfalli { get; set; } 
     public string since1julsnowfallm { get; set; } 
     public string since1julsnowfalli { get; set; } 
     public string snowdepthm { get; set; } 
     public string snowdepthi { get; set; } 
     public string hail { get; set; } 
     public string thunder { get; set; } 
     public string tornado { get; set; } 
     public string meantempm { get; set; } 
     public string meantempi { get; set; } 
     public string meandewptm { get; set; } 
     public string meandewpti { get; set; } 
     public string meanpressurem { get; set; } 
     public string meanpressurei { get; set; } 
     public string meanwindspdm { get; set; } 
     public string meanwindspdi { get; set; } 
     public string meanwdire { get; set; } 
     public string meanwdird { get; set; } 
     public string meanvism { get; set; } 
     public string meanvisi { get; set; } 
     public string humidity { get; set; } 
     public string maxtempm { get; set; } 
     public string maxtempi { get; set; } 
     public string mintempm { get; set; } 
     public string mintempi { get; set; } 
     public string maxhumidity { get; set; } 
     public string minhumidity { get; set; } 
     public string maxdewptm { get; set; } 
     public string maxdewpti { get; set; } 
     public string mindewptm { get; set; } 
     public string mindewpti { get; set; } 
     public string maxpressurem { get; set; } 
     public string maxpressurei { get; set; } 
     public string minpressurem { get; set; } 
     public string minpressurei { get; set; } 
     public string maxwspdm { get; set; } 
     public string maxwspdi { get; set; } 
     public string minwspdm { get; set; } 
     public string minwspdi { get; set; } 
     public string maxvism { get; set; } 
     public string maxvisi { get; set; } 
     public string minvism { get; set; } 
     public string minvisi { get; set; } 
     public string gdegreedays { get; set; } 
     public string heatingdegreedays { get; set; } 
     public string coolingdegreedays { get; set; } 
     public string precipm { get; set; } 
     public string precipi { get; set; } 
     public string precipsource { get; set; } 
     public string heatingdegreedaysnormal { get; set; } 
     public string monthtodateheatingdegreedays { get; set; } 
     public string monthtodateheatingdegreedaysnormal { get; set; } 
     public string since1sepheatingdegreedays { get; set; } 
     public string since1sepheatingdegreedaysnormal { get; set; } 
     public string since1julheatingdegreedays { get; set; } 
     public string since1julheatingdegreedaysnormal { get; set; } 
     public string coolingdegreedaysnormal { get; set; } 
     public string monthtodatecoolingdegreedays { get; set; } 
     public string monthtodatecoolingdegreedaysnormal { get; set; } 
     public string since1sepcoolingdegreedays { get; set; } 
     public string since1sepcoolingdegreedaysnormal { get; set; } 
     public string since1jancoolingdegreedays { get; set; } 
     public string since1jancoolingdegreedaysnormal { get; set; } 
    } 

    public class Station 
    { 
     public string city { get; set; } 
     public string state { get; set; } 
     public string country { get; set; } 
     public string icao { get; set; } 
     public string lat { get; set; } 
     public string lon { get; set; } 
    } 

    public class Airport 
    { 
     public List<Station> station { get; set; } 
    } 

    public class Station2 
    { 
     public string neighborhood { get; set; } 
     public string city { get; set; } 
     public string state { get; set; } 
     public string country { get; set; } 
     public string id { get; set; } 
     public double lat { get; set; } 
     public double lon { get; set; } 
     public int distance_km { get; set; } 
     public int distance_mi { get; set; } 
    } 

    public class Pws 
    { 
     public List<Station2> station { get; set; } 
    } 

    public class NearbyWeatherStations 
    { 
     public Airport airport { get; set; } 
     public Pws pws { get; set; } 
    } 

    public class Location 
    { 
     public string type { get; set; } 
     public string country { get; set; } 
     public string country_iso3166 { get; set; } 
     public string country_name { get; set; } 
     public string state { get; set; } 
     public string city { get; set; } 
     public string tz_short { get; set; } 
     public string tz_long { get; set; } 
     public string lat { get; set; } 
     public string lon { get; set; } 
     public string zip { get; set; } 
     public string magic { get; set; } 
     public string wmo { get; set; } 
     public string l { get; set; } 
     public string requesturl { get; set; } 
     public string wuiurl { get; set; } 
     public NearbyWeatherStations nearby_weather_stations { get; set; } 
    } 

    public class CurrentObservation 
    { 
     public Image image { get; set; } 
     public DisplayLocation display_location { get; set; } 
     public ObservationLocation observation_location { get; set; } 
     public Estimated estimated { get; set; } 
     public string station_id { get; set; } 
     public string observation_time { get; set; } 
     public string observation_time_rfc822 { get; set; } 
     public string observation_epoch { get; set; } 
     public string local_time_rfc822 { get; set; } 
     public string local_epoch { get; set; } 
     public string local_tz_short { get; set; } 
     public string local_tz_long { get; set; } 
     public string local_tz_offset { get; set; } 
     public string weather { get; set; } 
     public string temperature_string { get; set; } 
     public double temp_f { get; set; } 
     public double temp_c { get; set; } 
     public string relative_humidity { get; set; } 
     public string wind_string { get; set; } 
     public string wind_dir { get; set; } 
     public int wind_degrees { get; set; } 
     public double wind_mph { get; set; } 
     public int wind_gust_mph { get; set; } 
     public int wind_kph { get; set; } 
     public int wind_gust_kph { get; set; } 
     public string pressure_mb { get; set; } 
     public string pressure_in { get; set; } 
     public string pressure_trend { get; set; } 
     public string dewpoint_string { get; set; } 
     public int dewpoint_f { get; set; } 
     public int dewpoint_c { get; set; } 
     public string heat_index_string { get; set; } 
     public string heat_index_f { get; set; } 
     public string heat_index_c { get; set; } 
     public string windchill_string { get; set; } 
     public string windchill_f { get; set; } 
     public string windchill_c { get; set; } 
     public string feelslike_string { get; set; } 
     public string feelslike_f { get; set; } 
     public string feelslike_c { get; set; } 
     public string visibility_mi { get; set; } 
     public string visibility_km { get; set; } 
     public string solarradiation { get; set; } 
     public string UV { get; set; } 
     public string precip_1hr_string { get; set; } 
     public string precip_1hr_in { get; set; } 
     public string precip_1hr_metric { get; set; } 
     public string precip_today_string { get; set; } 
     public string precip_today_in { get; set; } 
     public string precip_today_metric { get; set; } 
     public string icon { get; set; } 
     public string icon_url { get; set; } 
     public string forecast_url { get; set; } 
     public string history_url { get; set; } 
     public string ob_url { get; set; } 
    } 

    public class ObservationLocation 
    { 
     public string full { get; set; } 
     public string city { get; set; } 
     public string state { get; set; } 
     public string country { get; set; } 
     public string country_iso3166 { get; set; } 
     public string latitude { get; set; } 
     public string longitude { get; set; } 
     public string elevation { get; set; } 
    } 

    public class Image 
    { 
     public string url { get; set; } 
     public string title { get; set; } 
     public string link { get; set; } 
    } 

    public class DisplayLocation 
    { 
     public string full { get; set; } 
     public string city { get; set; } 
     public string state { get; set; } 
     public string state_name { get; set; } 
     public string country { get; set; } 
     public string country_iso3166 { get; set; } 
     public string zip { get; set; } 
     public string magic { get; set; } 
     public string wmo { get; set; } 
     public string latitude { get; set; } 
     public string longitude { get; set; } 
     public string elevation { get; set; } 
    } 

    public class Estimated 
    { 
    } 

И вот вызов от основной.

class MainClass 
{ 
    public static void Main (string[] args) 
    { 

     Wunder data = new Wunder(); 
     string StationID = "KCOBOULD67"; 

     string CurrentConditions = data.GetCurrentConditions (StationID); 

     Console.WriteLine (CurrentConditions); 

    } 

} 

Наконец, этот метод вызывается. Я вынул свой Wunderground ключ. Если вы хотите пример возвращения JSON, проверьте ссылки в верхней части.

public String GetCurrentConditions(string StationID){ 

     String url = @"http://api.wunderground.com/api/" + wundergroundkey + "/conditions/q/pws:" + StationID + ".json"; 
     Uri uri = new Uri(url); 
     WebRequest webRequest = WebRequest.Create(uri); 
     WebResponse response = webRequest.GetResponse(); 
     StreamReader streamReader = new StreamReader(response.GetResponseStream()); 
     String responseData = streamReader.ReadToEnd(); 

     var container = JsonConvert.DeserializeObject<HistoryResponseContainer> (responseData); 

     String stationid = container.current_observation.station_id; 
     String station_lat = container.current_observation.observation_location.latitude; 
     String station_lon = container.current_observation.observation_location.longitude; 

     String station_data = stationid + station_lat + station_lon; 

     return (station_data); 

    } //End GetCurrentConditions 

Опять ошибка читает: Newtonsoft.Json.JsonReaderException была выброшена «Невозможно преобразовать строку в Integer: 5,0 Путь 'current_observation.wind_gust_mph', линия 60, позиция 24.

ответ

4

You предоставил нам ссылку на следующий JSON:

http://api.wunderground.com/api/21fd5aec70326254/conditions/q/CA/San_Francisco.json

Как видите, свойство wind_gust_mph 0 (withou t кавычки, поэтому Integer). Этот JSON также работает очень хорошо. Но в вашем коде используется следующий JSON:

http://api.wunderground.com/api/21fd5aec70326254/conditions/q/pws:KCOBOULD67.json

И свойство wind_gust_mph является «4,0» (с кавычками, поэтому String). И вы не можете разобрать свойство string в целое число. Также свойства для wind_kph и wind_gust_kph неверны, то это должно быть либо строка или дважды:

public string wind_gust_mph { get; set; } 
public double wind_kph { get; set; } 
public string wind_gust_kph { get; set; } 

Надеется, что это помогает и весёлые фонтанные.

+0

Именно так. Спасибо. Я это видел, но сам из себя выговорил. –

+1

Рад, что я могу вам помочь. Не могли бы вы отметить вопрос как ответ? :) –

Смежные вопросы