2016-08-25 3 views
0

Нового для кодирования и новых для JSON, у меня есть JSON строка: https://feeds.citibikenyc.com/stations/stations.jsonПолучить данные из строки JSON и привязать его к XAML

Теперь я могу получить временную метку, но не данные, как stationnames.

вот мой прокси

public class BPNewYorkCityProxy 
{ 
    public async static Task<RootObject> GetNewYorkCity() 
    { 
     var http = new HttpClient(); 
     var response = await http.GetAsync("https://feeds.citibikenyc.com/stations/stations.json"); 
     var result = await response.Content.ReadAsStringAsync(); 
     var serializer = new DataContractJsonSerializer(typeof(RootObject)); 

     var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
     var data = (RootObject)serializer.ReadObject(ms); 

     return data; 

    } 
} 

[DataContract] 
public class StationBeanList 
{ 
    [DataMember] 
    public int id { get; set; } 
    [DataMember] 
    public string stationName { get; set; } 
    [DataMember] 
    public int availableDocks { get; set; } 
    [DataMember] 
    public int totalDocks { get; set; } 
    [DataMember] 
    public double latitude { get; set; } 
    [DataMember] 
    public double longitude { get; set; } 
    [DataMember] 
    public string statusValue { get; set; } 
    [DataMember] 
    public int statusKey { get; set; } 
    [DataMember] 
    public int availableBikes { get; set; } 
    [DataMember] 
    public string stAddress1 { get; set; } 
    [DataMember] 
    public string stAddress2 { get; set; } 
    [DataMember] 
    public string city { get; set; } 
    [DataMember] 
    public string postalCode { get; set; } 
    [DataMember] 
    public string location { get; set; } 
    [DataMember] 
    public string altitude { get; set; } 
    [DataMember] 
    public bool testStation { get; set; } 
    [DataMember] 
    public string lastCommunicationTime { get; set; } 
    [DataMember] 
    public string landMark { get; set; } 
} 

[DataContract] 
public class RootObject 
{ 
    [DataMember] 
    public string executionTime { get; set; } 
    [DataMember] 
    public List<StationBeanList> stationBeanList { get; set; } 
} 

И вот мой код в моем XAML, как сказал метку времени получить, но теперь я хочу больше, как название станции и доступные места.

private async void GetData_Click(object sender, RoutedEventArgs e) 
    { 
     RootObject nycParking = await BPNewYorkCityProxy.GetNewYorkCity(); 

     // how to get a stationname .. my proxy creates a list, does it?... 
     //myStationName.Text = 

     // Well this works 
     myTimeStamp.Text = nycParking.executionTime.ToString(); 

    } 

Как это сделать? заранее спасибо

+2

Вы действительно должны рассмотреть возможность использования другого сериалайзер. Newtonsoft Json.Net имеет лучшую производительность и функции, чем DataContractJsonSerializer, и не требует приписывания каждому классу и свойству. Не говоря уже о том, что он имеет гораздо более интуитивный API. –

ответ

0

Вы правы, что прокси-сервер возвращает список

public List<StationBeanList> stationBeanList { get; set; } 

Поскольку у вас есть несколько списков, вы не можете показать это в одном текстовом поле. Поэтому вам нужен список

<ListBox x:Name="stations"/> 

Далее необходимо настроить, как будет выглядеть каждый элемент в списке. В XAML, который называется DataTemplate. Так давайте настроим один для нашего списка:

<ListBox x:Name="stations"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding stationName}" Margin="5"/> 
       <TextBlock Text="{Binding availableDocks}" Margin="5"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Наконец, для заполнения списка с результатами, в коде-за файл, который необходимо присвоить свойство ItemsSource списка на данные, которые вы получаете от сервера:

private async void GetData_Click(object sender, RoutedEventArgs e) 
{ 
    RootObject nycParking = await BPNewYorkCityProxy.GetNewYorkCity(); 

    // how to get a stationname .. my proxy creates a list, does it?... 
    stations.ItemsSource = nycParking.stationBeanList; 
    // Well this works 
    myTimeStamp.Text = nycParking.executionTime.ToString(); 
} 

Это все, и оно должно работать для вашего простого примера. Однако вам, вероятно, придется работать над шаблоном XAML и сделать его более приятным. Есть много понятий, которые вы должны работать и улучшать код с:

  • Создание модели вид из модели данных
  • Использование Data Binding связать ListBox ItemsSource для результирующего набора (MVVVM)
  • Использование {х: Bind} вместо старого {Binding} - необязательно, для выполнения
+0

Q: Мне также нужно создать viewmodel? с целью повторного использования? Связывание данных у меня есть, что под моим поясом, и да, стиль нуждается в работе :), я попробую это позже. – TdZ

+0

Вопрос: о x: Bind, тогда мне нужно установить datatemplet в источник товаров.могу ли я использовать stationBeanList там? – TdZ

+0

thnks, но у меня все еще есть некоторая работа – TdZ

1

RootObject обертывает список stationBeanList, и я полагаю, это то, что вы хотите.

private async void GetData_Click(object sender, RoutedEventArgs e) 
{ 
    RootObject nycParking = await BPNewYorkCityProxy.GetNewYorkCity(); 

    foreach (var station in nycParking.stationBeanList) 
    { 
     // Access all of them here may be? 
     Console.WriteLine(station.stationName); 
    } 

    // Well this works 
    myTimeStamp.Text = nycParking.executionTime.ToString(); 

} 

Но если вы хотите более простой рабочий процесс, я хотел бы предложить использовать Json.NET, если это не является проблемой для вас

public class BPNewYorkCityProxy 
{ 
    public static async Task<RootObject> GetNewYorkCity() 
    { 
     var http = new HttpClient(); 
     var response = await http.GetAsync("https://feeds.citibikenyc.com/stations/stations.json"); 
     var result = await response.Content.ReadAsStringAsync(); 
     var data = JsonConvert.DeserializeObject<RootObject>(result); 
     return data; 
    } 
} 
public class StationBeanList 
{ 
    public int id { get; set; } 
    public string stationName { get; set; } 
    public int totalDocks { get; set; } 
    public double latitude { get; set; } 
    public double longitude { get; set; } 
    public string statusValue { get; set; } 
    public int statusKey { get; set; } 
    public int availableBikes { get; set; } 
    public string stAddress1 { get; set; } 
    public string stAddress2 { get; set; } 
    public string city { get; set; } 
    public string postalCode { get; set; } 
    public string location { get; set; } 
    public string altitude { get; set; } 
    public bool testStation { get; set; } 
    public string lastCommunicationTime { get; set; } 
    public string landMark { get; set; } 
} 

public class RootObject 
{ 
    public string executionTime { get; set; } 
    public List<StationBeanList> stationBeanList { get; set; } 
} 
+0

Выглядит чисто, Thnx, я рассмотрю использование JSON.NET, попробую позже сегодня. – TdZ

+0

использовал JSON.net, намного проще, использовал привязку с другого ответа – TdZ

+0

Прохладный, lemme знаю, как вам это нравится. –

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