2017-05-07 89 views
2

獲取數據我正在嘗試製作簡單的UWP天氣應用程序,僅用於學習目的,而且我無法從JSON獲取數據。C#JSON從列表<>

如何從公共類ConsolidatedWeather獲取最小和最大溫度? 我可以從其他類獲取數據。

非常感謝

Vrime.cs

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net.Http; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Json; 
using System.Text; 
using System.Threading.Tasks; 
using Newtonsoft.Json; 


namespace _01_Weaather 
{ 

class Vrime 
{ 

    public async static Task<ConsolidatedWeather> ShowTemp() 
    { 
     var http = new HttpClient(); 
     var url = String.Format("https://www.metaweather.com/api/location/44418/"); 
     var response = await http.GetAsync(url); 
     var result = await response.Content.ReadAsStringAsync();   
     var ser = new DataContractJsonSerializer(typeof(ConsolidatedWeather)); 
     var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
     var data = (ConsolidatedWeather)ser.ReadObject(ms); 

     return data; 
    } 
} 

[DataContract] 
public class ConsolidatedWeather 
{ 
    [DataMember] 
    public object id { get; set; } 
    [DataMember] 
    public string weather_state_name { get; set; } 
    [DataMember] 
    public string weather_state_abbr { get; set; } 
    [DataMember] 
    public string wind_direction_compass { get; set; } 
    [DataMember] 
    public string created { get; set; } 
    [DataMember] 
    public string applicable_date { get; set; } 
    [DataMember] 
    public double min_temp { get; set; } 
    [DataMember] 
    public double max_temp { get; set; } 
    [DataMember] 
    public double the_temp { get; set; } 
    [DataMember] 
    public double wind_speed { get; set; } 
    [DataMember] 
    public double wind_direction { get; set; } 
    [DataMember] 
    public double air_pressure { get; set; } 
    [DataMember] 
    public int humidity { get; set; } 
    [DataMember] 
    public double? visibility { get; set; } 
    [DataMember] 
    public int predictability { get; set; } 
} 
[DataContract] 
public class Parent 
{ 
    [DataMember] 

    public string title { get; set; } 
    [DataMember] 
    public string location_type { get; set; } 
    [DataMember] 
    public int woeid { get; set; } 
    [DataMember] 
    public string latt_long { get; set; } 
} 
[DataContract] 
public class Source 
{ 
    [DataMember] 
    public string title { get; set; } 
    [DataMember] 
    public string slug { get; set; } 
    [DataMember] 
    public string url { get; set; } 
    [DataMember] 
    public int crawl_rate { get; set; } 
} 
[DataContract] 
public class RootObject 
{[DataMember] 
    public List<ConsolidatedWeather> consolidated_weather { get; set; } 
    [DataMember] 
    public string time { get; set; } 
    [DataMember] 
    public string sun_rise { get; set; } 
    [DataMember] 
    public string sun_set { get; set; } 
    [DataMember] 
    public string timezone_name { get; set; } 
    [DataMember] 
    public Parent parent { get; set; } 
    [DataMember] 
    public List<Source> sources { get; set; } 
    [DataMember] 
    public string title { get; set; } 
    [DataMember] 
    public string location_type { get; set; } 
    [DataMember] 
    public int woeid { get; set; } 
    [DataMember] 
    public string latt_long { get; set; } 
    [DataMember] 
    public string timezone { get; set; } 
} 

MainPage.xaml中

namespace _01_Weaather 
{ 
/// <summary> 
/// An empty page that can be used on its own or navigated to within a Frame. 
/// </summary> 
public sealed partial class MainPage : Page 
{ 
    double min; 
    double max; 


    public MainPage() 
    { 
     this.InitializeComponent(); 



    } 

    private async void BtnPrikaz_OnClick(object sender, RoutedEventArgs e) 
    { 
     ConsolidatedWeather cWeather = await Vrime.ShowTemp(); 
     min =cWeather.min_temp; 
     max = cWeather.max_temp; 
     txtTemp.Text = String.Format(min.ToString() + "\n"+ max.ToString()); 


    } 

} 
+0

從哪裏得到最小值和最大值作爲函數的輸入值? – Sajeetharan

+0

從課ConsolidateWeather。 – Toni0123

+0

它們始終爲零(0)。 – Toni0123

回答

2

您的反序列化不在正確的對象上。它應該在RootObject上。由於天氣API所反映的JSON會返回未來日期的數據,因此如果您需要今天的最低和最高溫度,則下面是示例代碼。

public async Task<RootObject> ShowTemp() 
    { 
     var http = new HttpClient(); 
     var url = String.Format("https://www.metaweather.com/api/location/44418/"); 
     var response = await http.GetAsync(url); 
     var result = await response.Content.ReadAsStringAsync(); 
     var ser = new DataContractJsonSerializer(typeof(RootObject)); 
     var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
     var data = (RootObject)ser.ReadObject(ms); 

     return data; 
    } 

    public async Task<ConsolidatedWeather> GetWeatherForToday() 
    { 
     RootObject ro = await ShowTemp(); 
     ConsolidatedWeather todayWeather = ro.consolidated_weather.FirstOrDefault(); 
     return todayWeather; 

     // for getting min and max 
     // todayWeather.min_temp; 
     // todayWeather.max_temp; 
    } 
+0

非常感謝,它的工作原理。 – Toni0123

1

嘗試改變的屬性的數據類型分鐘&最高溫度浮起並您正在使用錯誤的對象類型進行反序列化。使用你的根對象。另外,我建議使用類似restsharp的API來消費。這將讓你的生活變得更加輕鬆。

+0

Stil最小和最大溫度顯示爲0. – Toni0123

+0

編輯答案 – CoderKK

+0

你能寫出如何反序列化root對象? – Toni0123