2017-05-07 1 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

함수의 입력으로 min 및 max 값을 가져 오는 위치는 어디입니까? – Sajeetharan

+0

ConsolidateWeather 클래스에서입니다. – Toni0123

+0

항상 0입니다. – Toni0123

답변

2

역 직렬화가 올바른 개체에 없습니다. RootObject에 있어야합니다. weather API에 의해 retired 된 JSON이 미래 날짜에 대한 데이터를 반환하기 때문에 오늘의 Min 및 Max 온도가 필요한 경우 샘플 코드가 아래에 나와 있습니다.

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

떠 & 최대 온도 최소 속성의 데이터 유형을 변경 시도 당신은 잘못된 개체 형식을 사용하여 deserialize하고 있습니다. 루트 객체를 사용하십시오. 또한, 나는 api 소비에 대한 restsharp 같은 것을 사용하는 것이 좋습니다거야. 너의 인생을 2 배나 쉽게 만들어 줄거야.

+0

스틸 최소 및 최대 온도는 0을 표시합니다. – Toni0123

+0

이 (가) – CoderKK

+0

으로 편집 됨 루트를 비 직렬화하는 방법을 써 주실 수 있습니까? 객체? – Toni0123