日期:2014-06-10  浏览次数:20665 次

 /// <summary>
    /// http://www.weather.com.cn/data/sk/101280601.html
    ///  {"weatherinfo":{"city":"深圳","cityid":"101280601","temp":"32","WD":"西南风","WS":"4级","SD":"68%","WSE":"4","time":"16:40","isRadar":"1","Radar":"JC_RADAR_AZ9755_JB"}}
    /// 20140531 涂聚文 Geovin Du
    /// </summary>
    public class WeatherInfo 
    {


        //public  string city;
        //public string cityid;
        //public string temp;
        //public string WD;
        //public string WS;
        //public string SD;
        //public string WSE;
        //public string time;
        //public string isRadar;
        //public string Radar;

        string _city;
        string _cityid;
        string _temp;
        string _WD;
        string _WS;
        string _SD;
        string _WSE;
        string _time;
        string _isRadar;
        string _Radar;
        /// <summary>
        /// 城市名称
        /// </summary>
        public string city
        {

            get
            {
                return _city;
            }
            set
            {
                _city = value;
            }
        }
        /// <summary>
        /// 城市代码
        /// </summary>
        public string cityid
        {
            get
            {
                return _cityid;
            }
            set
            {
                _cityid = value;
            }
            //get;
            //set;
        }
        /// <summary>
        /// 温度
        /// </summary>
        public string temp
        {
            get
            {
                return _temp;
            }
            set
            {
                _temp = value;
            }

        }
        /// <summary>
        /// 风向
        /// </summary>
        public string WD
        {
            get
            {
                return _WD;
            }
            set
            {
                _WD = value;
            }
      
        }
        /// <summary>
        /// 风级
        /// </summary>
        public string WS
        {
            get
            {
                return _WS;
            }
            set
            {
                _WS = value;
            }
      
        }
        /// <summary>
        /// 湿度
        /// </summary>
        public string SD
        {
            get
            {
                return _SD;
            }
            set
            {
                _SD = value;
            }
     
        }
        /// <summary>
        /// 
        /// </summary>
        public string WSE
        {
            get
            {
                return _WSE;
            }
            set
            {
                _WSE = value;
            }

        }
        /// <summary>
        /// 发布时间
        /// </summary>
        public string time
        {
            get
            {
                return _time;
            }
            set
            {
                _time = value;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public string isRadar
        {
            get
            {
                return _isRadar;
            }
            set
            {
                _isRadar = value;
            }

      
        }
        /// <summary>
        /// 
        /// </summary>
        public string Radar
        {
            get
            {
                return _Radar;
            }
            set
            {
                _Radar = value;
            }

        
        }
        private Dictionary<string, object> _theRest = new Dictionary<string, object>();
        public Dictionary<string, object> TheRest
        {
            get { return _theRest; }


        }   
        // public Dictionary<string, decimal> Rates { get; set; }
    }
/// <summary>
    /// http://www.weather.com.cn/data/sk/101280601.html
    /// 20140531 涂聚文 Geovin Du
    /// </summary>
    public class WeatherInfoConverter : CustomCreationConverter<WeatherInfo>
    {
        public override WeatherInfo Create(Type objectType)
        {
            return new WeatherInfo();
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            WeatherInfo mappedObj = new WeatherInfo();
            //get an array of the object's props so I can check if the JSON prop s/b mapped to it
            PropertyInfo[] myPropertyInfo;
            myPropertyInfo = objectType.GetProperties();
            string objProps = string.Empty;

            //for (int i = 0; i < myPropertyInfo.Length; i++)
            //{
            //    objProps = objProps +" "+ myPropertyInfo[i].ToString();
            //}

            foreach (PropertyInfo pi in objectType.GetProperties())
            {
                object value1 = pi.GetValue(mappedObj, null);//用pi.GetValue获得值  
                objProps = objProps + " " + pi.Name;//获得属性的名字,后面就可以根据名字判断来进行些自己想要的操作  
                //获得属性的类型,进行判断然后进行以后的操作,例如判断获得的属性是整数  
                //if(value1.GetType() == typeof(int))   
                //{   
                //    //进行你想要的操作  
                //}   
            }  
             //objProps = myPropertyInfo[0].Name.ToLower().ToString(); //objectType.GetProperties().Select(p => p.Name.ToLower()).ToArray();

            //loop through my JSON string
            while (reader.Read())
            {
                //if I'm at a property...
                if (reader.TokenType == JsonToken.PropertyName)
                {
                    //convert the property to lower case
                    string readerValue = reader.Value.ToString().ToLower();
                    if (reader.Read())  //read in the prop value
                    {
                        //is this a mapped prop?
                        if (objProps.Contains(readerValue))
                        {
                            //get the property info and set the Mapped object's property value
                            PropertyInfo pi = mappedObj.GetType().GetProperty(readerValue, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
                            object convertedValue = Convert.ChangeType(reader.Value, pi.PropertyType);
                            pi.SetValue(mappedObj, convertedValue, null);
                        }
                        else
                        {
                            //otherwise, stuff it into the Dictionary
                            mappedObj.TheRest.Add(readerValue, reader.Value);
                        }
                    }
                }
            }
            return mappedObj;
        }
    }

 

  /// <summary>
    /// http://www.weather.com.cn/data/sk/101280601.html
    /// http://www.weather.com.cn/data/cityinfo/101280601.html
    /// http://geoip.weather.com.cn/g/
    /// http://m.weather.com.cn/data/101190101.html
    /// 20140531 涂聚文 Geovin Du
    /// {"weatherinfo":{"city":"深圳","cityid":"101280601","temp":"32","WD":"西南风","WS":"4级","SD":"68%","WSE":"4","time":"16:40","isRadar":"1","Radar":"JC_RADAR_AZ9755_JB"}}
    /// </summary>
    public partial class WebForm1 : System.Web.UI.Page
    {
        string json_data = string.Empty;
        string url = string.Empty;

        //WeatherInfo we = new WeatherInfo();
        /// <summary>
        /// http://social.msdn.microsoft.com/Forums/en-US/4392c97a-3c6e-45b9-99c9-12a979c64910/c-20-jsonnet
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                url = "http://www.weather.com.cn/data/sk/101280601.html";

                WebClient wc = new WebClient();
                wc.Encoding = System.Text.Encoding.UTF8;//定义对象语言
                json_data = wc.DownloadString(url);
                //JsonConvert.DeserializeObject<Table>(json_data);
                //var ser = new JavaScriptSerializer();
                //we = _download_serialized_json_data<WeatherInfo>(url); 
                JsonSerializerSettings settings = new JsonSerializerSettings();
                WeatherInfo we = JsonConvert.DeserializeObject<WeatherInfo>(json_data, new WeatherInfoConverter());// JsonConvert.DeserializeObject(json_data, Type.GetType, we);                         

                Response.Write("城市:"+we.city);
                Response.Write("城市代码:" + we.cityid);
                Response.Write("温度:" + we.temp);
                Response.Write("发布时间:" + we.time);
                //Response.Write(we.TheRest[""].ToString());
                Response.Write("发风:" + we.WD);
                Response.Write("湿度:" + we.SD);

                Dictionary<string, object> dict = we.TheRest;
                //Response.Write(we.TheRest["WD"].ToString());
                //for (int i = 0; i < dict.Count; i++)
                //{
                //    Response.Write(dict.Keys.ToString());
                //    Response.Write(dict.Values.ToString());

                //}
                foreach (KeyValuePair<string, object> kvp in dict)
                {
                    //outputBlock.Text += String.Format("Key = {0}, Value = {1}", kvp.Key, kvp.Value) + "\n";
                    string s = string.Format("键是:{0}  值是:{1}", kvp.Key.ToString(), (!object.Equals(kvp.Value, null) ? kvp.Value.ToString(): ""));
                    Response.Write(s);
                }

                //Hashtable dict = new Hashtable();
                //foreach (DictionaryEntry i in dict)
                //{
                //    string s = string.Format("键是:{0}  值是:{1}", i.Key.ToString(), i.Value.ToString());
                //    Response.Write(s);
                //}
 
            }
            catch (JsonReaderException tu)
            {
                Response.Write(tu.Message.ToString());
            }

        }

        //.net 4.0
        //private static T _download_serialized_json_data<T>(string url) where T : new()
        //{
        //    using (WebClient w = new WebClient())
        //    {
        //      string  json_data = string.Empty;
        //        // attempt to download JSON data as a string
        //        try
        //        {
        //            json_data = w.DownloadString(url);
        //        }
        //        catch (Exception) { }
        //        // if string with JSON data is not empty, deserialize it to class and return its instance 
        //        return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T();
        //    }
        //}

    }

 http://james.newtonking.com/json