c# - 使用 NewtonSoft 解析 JSON 时出错

标签 c# .net json json.net

圣诞快乐!我正在尝试从 Wunderground 天气 API 解析一些 JSON,并且在尝试为变量赋值时遇到了问题。 Here是 JSON 的链接。只需知道我提供的类结构是一个集团,以便容纳多个 JSON 返回文件结构。我将给出类结构,然后是来自 main 的调用,最后是带有错误标记的实际方法。我在 Xamarin 工作,以前是 MonoDevelop。感谢您提出任何建议!

错误如下: 已抛出 Newtonsoft.Json.JsonReaderException “无法将字符串转换为整数: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
    {
    }

这是来自 main 的调用。

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

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

        string CurrentConditions = data.GetCurrentConditions (StationID);

        Console.WriteLine (CurrentConditions); 

    }

}

最后,这是被调用的方法。我拿出了我的 Wunderground key 。如果您想要返回 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 “无法将字符串转换为整数:5.0 路径 'current_observation.wind_gust_mph',第 60 行,第 24 位。

最佳答案

您向我们提供了指向以下 JSON 的链接:

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

如您所见,属性 wind_gust_mph 为 0(没有引号,因此为整数)。这个 JSON 也很好用。但是在您的代码中,您使用以下 JSON:

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

属性 wind_gust_mph 是“4.0”(带引号,所以是一个字符串)。而且您不能将字符串属性解析为整数。 wind_kphwind_gust_kph 的属性也是错误的,这应该是字符串或 double :

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

希望这对您有所帮助,祝您圣诞快乐。

关于c# - 使用 NewtonSoft 解析 JSON 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20774555/

相关文章:

c# - 将十进制值格式化为具有 2 个小数位的货币

c# - 如何使用 Linq 在 Enumerable<T2> 中获取类 T2 成员的 IEnumerable<T1>? (C#)

c# - DotPeek 无法正确反序列化 dll

c# - Umbraco .Net 命名空间有任何意义或组织吗?

c# - 如果磁盘已满,是否会抛出 IO 异常?

ios - 导入 JSON 数组

javascript - 无法从本地主机中的 php 文件获取 json 数据

c# - Action 的 MVC4 查询字符串

c# - 返回复杂对象或使用引用/输出参数是更好的做法吗?

javascript - 从谷歌电子表格中特定范围的单元格获取json数据