2016-06-15 56 views
0

我试图从网上获取天气数据作为json,然后将json反序列化成可以使用的对象。这里是我的代码:反序列化Json字符串到对象

public static RootObject7 GetWeather7(int zip) 
    { 
     var url = "http://api.weatherunlocked.com/api/forecast/us." + zip.ToString() + "?app_id=xxxxxxx&app_key=xxxxxxxxxxxxxxxxxxxxxxx"; 
     var weather = new wunlocked(); 
     string json = weather.getJson(url); 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     var data = (RootObject7)serializer.Deserialize<RootObject7>(json); 
     return data; 
    } 
private string getJson(string url) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     try 
     { 
      WebResponse response = request.GetResponse(); 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
       return reader.ReadToEnd(); 
      } 
     } 
     catch (WebException ex) 
     { 
      WebResponse errorResponse = ex.Response; 
      using (Stream responseStream = errorResponse.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); 
       String errorText = reader.ReadToEnd(); 
      } 
      throw; 
     } 
    } 

我调试,以及正在发生的事情是在创建我的RootObject7数据对象,它里面有一个“预测”对象,它应该包含的其他信息的列表,而是它是空的。我已经定义了所有的类(它们很长,所以如果它很重要,我会发布它们,否则我认为我不需要)。我从来没有做过这样的事情,因此大部分来自我在这里找到的其他代码示例,但显然我没有正确地将它们放在一起,因为我的对象始终为空,但是当我转到url时,那里有有效的xml。我不确定是否需要以某种方式将xml转换为json,或者以某种方式完成该操作?就像我说的,我真的不知道我在做什么,但如果有人有建议,那会很棒。

+0

而不是JavaScriptSerializer使用Json.NET。并显示Json和clasess。 – BWA

+0

当你使用你自己的类建立一个虚拟预测,然后* serialize *,你会得到类似于你从web服务中获得的JSON吗?在你的调试器中调用 –

+0

,在'string json = weather.getJson(url);'后面加上一个断点,看看'json'变量是否按照预期填充。 – Falanwe

回答

0

尝试

dynamic data = serializer.Deserialize(json); 

,然后检查在调试器中的数据对象 - 你可能不需要deserialise到一个固定的接口来获得你所需要的数据。使用动态可能也是更强大的解决方案来处理服务的升级,可能会使设置的界面/对象变得更脆弱。