2013-11-18 5 views
0

Я хочу разработать приложение для погоды для windows phone. Я создал простой пользовательский интерфейс для тестирования. Содержит одну сетку с текстовым полем и кнопкой, чтобы ввести название города. Вторая сетка имеет разные метки для отображения данных о погоде после нажатия кнопки.Извлечение данных из вложенных Json в C#

Я использую API из openweathermap.org .I сделали классы из данных Json:

{"coord":{"lon":-120.5,"lat":47.5},"sys":{"message":0.195,"country":"US","sunrise":1384787560,"sunset":1384820527},"weather":[{"id":800,"main":"Clear","description":"sky is clear","icon":"01d"}],"base":"gdps stations","main":{"temp":277.15,"pressure":1010,"humidity":86,"temp_min":277.15,"temp_max":277.15},"wind":{"speed":0.31,"deg":230.5},"rain":{"3h":1},"clouds":{"all":1},"dt":1384797300,"id":5815135,"name":"Washington","cod":200} 

И классы:

public class Coord 
{ 
    public double lon { get; set; } 
    public double lat { get; set; } 
} 

public class Sys 
{ 
    public double message { get; set; } 
    public string country { get; set; } 
    public int sunrise { get; set; } 
    public int sunset { get; set; } 
} 

public class Weather 
{ 
    public int id { get; set; } 
    public string main { get; set; } 
    public string description { get; set; } 
    public string icon { get; set; } 
} 

public class Main 
{ 
    public double temp { get; set; } 
    public double temp_min { get; set; } 
    public double temp_max { get; set; } 
    public double pressure { get; set; } 
    public double sea_level { get; set; } 
    public double grnd_level { get; set; } 
    public int humidity { get; set; } 
} 

public class Wind 
{ 
    public double speed { get; set; } 
    public double deg { get; set; } 
} 

public class Clouds 
{ 
    public int all { get; set; } 
} 

public class RootObject 
{ 
    public Coord coord { get; set; } 
    public Sys sys { get; set; } 
    public List<Weather> weather { get; set; } 
    public string { get; set; } 
    public Main main { get; set; } 
    public Wind wind { get; set; } 
    public Clouds clouds { get; set; } 
    public int dt { get; set; } 
    public int id { get; set; } 
    public string name { get; set; } 
    public int cod { get; set; } 
} 

Я использую Json.NET для извлечение данных из полученных json.My Json данных не имеют списка, а один объект. Я видел примеры того, как список может быть привязан к ListItem в xaml. Но я не знаю, как это сделать на одном объекте. XAML:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Grid x:Name="boxOfSearch" Grid.Row="0"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="8*"/> 
       <ColumnDefinition Width="2*" /> 
      </Grid.ColumnDefinitions> 
      <TextBox x:Name="getEnteredString" Margin="2,1"/> 
      <Button Grid.Column="1" x:Name="btnGet" Tap="btnGet_Tap">Go</Button> 
      <!--<Button x:Name="goButton" Content="Go" Grid.Column="1" Margin="2,1"       Click="goButton_Click"/>--> 
     </Grid> 

     <Grid Grid.Row="1" x:Name="extractedData" Height="532"> 
    <Grid.RowDefinitions> 
       <RowDefinition Height="3*"/> 
       <RowDefinition Height="1*"/> 
    <RowDefinition Height="1*"/> 
       </Grid.RowDefinitions> 
         <TextBlock x:Name="getName" Text="{Binding name}" Margin="2,2,2,5" Foreground="#FF176EB5" FontSize="48" TextAlignment="Center" /> 

То, что я хочу, чтобы иметь выход являются: Название города, высокой и низкой температуры temperature.Name и из разных classes.If я могу получить эти значения отдельно его может быть отличной отправной точкой для меня.

private void btnGet_Tap(object sender, GestureEventArgs e) 
    { 
     WebClient wc = new WebClient(); 
     wc.DownloadStringAsync(new Uri("")); 
     wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted); 
    } 

    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 

     MessageBox.Show(e.Result);       

     var rootObj=JsonConvert.DeserializeObject<RootObject>(e.Result); //Getting DeserializedObject in a variable 
     getJsonStrTxtBox.Text = rootObj.name;  // var.name where name (Name of the City) is a string in RootObject class 
    }            //like var.name add var.main.temp_max 

Теперь я могу получить любые данные из вложенного json. Json.net и @evanmcdonnal большое спасибо.

City name plus temprature

ответ

1

Я немного смущен ваш вопрос, но это звучит, как вы на самом деле просто ищете что-то вроде этого;

RootObject response = JsonConvert.DeserializeObject<RootObject>(responseBody); 

    string message = String.Format("City: {0} - high: {1}, low: {2}", response.name, response.main.temp_max, response.main.temp_mix); 

    MessageBox.Show(message); 

ПРИМЕЧАНИЕ: Я рекомендовал бы некоторые проверки для недействительности, которые я не включил в приведенном выше примере (это нулевой ответ Ok, это response.main нуль?). Когда вы используете метод json.NET DeserializeObject на сложном объекте, десериализация «каскадирует» (из-за отсутствия лучшего термина), что означает, что все объекты, из которых состоит десериализация класса, будут также десериализованы соответствующим образом. Оттуда вы получите доступ к ним, как к любому другому объекту, есть еще один слой косвенности.

+0

Мне удалось получить название города с. Использование объекта.name или вашего упомянутого имени response.name уже. Но максимальный и минимальный темратура находятся в другом классе с именем «Main», а Path - RootObject -> Main. –

+0

@NavS жаль, что я недостаточно читал ваши определения классов, обновляя приход. – evanmcdonnal

+0

Большое спасибо. Он работал. Иногда вы не можете получить даже простейшие вещи, если кто-то не там, чтобы вести вас. –

1

Использования http://james.newtonking.com/json

class Program 
    { 
     static void Main(string[] args) 
     { 
      var json = 
       "{\"coord\":{\"lon\":-120.5,\"lat\":47.5},\"sys\":{\"message\":0.195,\"country\":\"US\",\"sunrise\":1384787560,\"sunset\":1384820527},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"sky is clear\",\"icon\":\"01d\"}],\"base\":\"gdps stations\",\"main\":{\"temp\":277.15,\"pressure\":1010,\"humidity\":86,\"temp_min\":277.15,\"temp_max\":277.15},\"wind\":{\"speed\":0.31,\"deg\":230.5},\"rain\":{\"3h\":1},\"clouds\":{\"all\":1},\"dt\":1384797300,\"id\":5815135,\"name\":\"Washington\",\"cod\":200}"; 

      dynamic obj = JsonConvert.DeserializeObject(json); 

      Console.WriteLine(obj.coord.lon + " " + obj.coord.lat); 

      Console.ReadLine(); 
     } 
    } 

Извлечение данных первые и отобразить его на классы. Затем обработайте события пользовательского интерфейса.

Смежные вопросы