2014-01-04 3 views
0

Я столкнулся с этой проблемой в течение нескольких дней, я не смог ее решить. Список в моем телефоне Windows ничего не отображает. Я даже не уверен, работает ли json deser.Listbox не отображает десериализованные данные JSON

Код примера json внутри кода C#.

Это часть C# в WP8

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    webserv.maintain_serverPortTypeClient tables = new webserv.maintain_serverPortTypeClient(); 
    tables.view_tableAsync(); 
    tables.view_tableCompleted += new EventHandler<webserv.view_tableCompletedEventArgs>(tbviewcomplete); 
} 

public void tbviewcomplete(object obj, webserv.view_tableCompletedEventArgs e) 
{ 
    MessageBox.Show(e.Result.ToString()); 
    // var table_json = e.Result.ToString(); 

    // var table_json = "[{\"tableID\":\"61\",\"size\":\"4\",\"zone\":\"Non-Smoking\",\"area\":\"Outdoor\"},{\"tableID\":\"62\",\"size\":\"4\",\"zone\":\"Non-Smoking\",\"area\":\"Outdoor\"},{\"tableID\":\"63\",\"size\":\"4\",\"zone\":\"Smoking\",\"area\":\"Indoor\"},{\"tableID\":\"64\",\"size\":\"30\",\"zone\":\"Smoking\",\"area\":\"Indoor\"}]"; 
    // MyTables[] result = JsonConvert.DeserializeObject<MyTables[]>(table_json); 

    List<MyTables> gesult = JsonConvert.DeserializeObject<List<MyTables>>(e.Result); 
    tableview.ItemsSource = gesult; 
} 

public class MyTables 
{ 
    public string table_id { get; set; } 
    public string table_size { get; set; } 
    public string table_zone { get; set; } 
    public string table_area { get; set; } 
} 

И это часть кода XAML.

<ListBox x:Name="tableview" ItemsSource="{Binding data}" HorizontalAlignment="Left"  Height="474" VerticalAlignment="Top" Width="456"> 
<ListBox.ItemTemplate> 
         <DataTemplate> 
          <StackPanel DataContext="{Binding}"> 
           <TextBlock FontSize="{StaticResource PhoneFontSizeMedium}" Text="{Binding table_id}" /> 
           <TextBlock Text="{Binding table_size}" /> 
           <TextBlock Text="{Binding table_zone}" /> 
           <TextBlock Text="{Binding table_area}" /> 
          </StackPanel> 
         </DataTemplate> 
</ListBox.ItemTemplate> 


</ListBox> 

Я не знаю, где пошло не так, и оно не отображается. Пожалуйста, бросьте мне несколько советов. Я очень новичок в C# и Json.

+0

Если установить точки останова делает 'gesult' содержит ряд результатов, как ожидалось? – geedubb

+0

Tnx Brent для редактирования. Теперь вопрос имеет смысл. @ user3159789, вопросы не могут содержать теги, поэтому ваш вопрос был отредактирован. –

+0

О, я вижу, я не знал, поскольку я новичок в stackoverflow. По-видимому, это мой первый пост. Спасибо за помощь ! –

ответ

0

Для делать то, что вы хотите, первый или вы должны использовать точные имена полей, используемые в JSON строки или использовать System.Runtime.Serialization.DataContract и System.Runtime.Serialization.DataMember атрибуты для украшения MyTable класса и его свойства для того, чтобы использовать произвольные имена свойств. Так MyTable класса будет выглядеть следующим образом без контракта:

public class MyTable 
{ 
    public string tableID { get; set; } 
    public int size { get; set; } 
    public string zone { get; set; } 
    public string area { get; set; } 
} 

или как это с DataContract:

using System.Runtime.Serialization; 

... 

[DataContract] 
public class MyTable 
{ 
    [DataMember(Name = "tableID")] 
    public string table_id { get; set; } 

    [DataMember(Name = "size")] 
    public int table_size { get; set; } 

    [DataMember(Name = "zone")] 
    public string table_zone { get; set; } 

    [DataMember(Name = "area")] 
    public string table_area { get; set; } 
} 

Обратите внимание, что, JSON имени поля может быть задано с помощью Name свойства DataMember атрибута. Таким образом, вы можете использовать любое имя свойства в вашем классе MyTable.

Затем используйте этот десериализовать ваш JSON строку:

System.Runtime.Serialization.Json.DataContractJsonSerializer ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(List<MyTable>)); 
string table_json = e.Result.ToString(); 
List<MyTable> result; 
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(table_json))) 
{ 
    result = (List<MyTable>)ser.ReadObject(ms); 
} 

Обратите внимание, что вы должны добавить System.Runtime.Serialization.dll ваши ссылки проекта.

+0

Спасибо, мистер Арин! Вы научили меня чему-то новому, и спасибо за помощь. Я очень ценю это. –

0

XAML

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
      <ListBox x:Name="MyListBox"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding Artist}"/> 
          <TextBlock Text="{Binding Duration}"/> 
         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </Grid> 

и C# код:

public class MyDataClass 
{ 
    public string Artist { get; set; } 
    public string Duration { get; set; } 

    public MyDataClass(string artist, int duration) 
    { 
     TimeSpan span = TimeSpan.FromSeconds(duration); 
     Artist = artist; 
     Duration = span.ToString(); 
    } 
} 

public void AudioGet() 
{ 
    var clientAudio = new WebClient(); 
    clientAudio.OpenReadCompleted += clientAudio_OpenReadCompleted; 
    string uri = "https://api.vk.com/method/audio.get?"; 
    clientAudio.OpenReadAsync(new Uri(uri)); 
} 

private void clientAudio_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    List<MyDataClass> audioList = new List<MyDataClass>(); 
    var root = new DataContractJsonSerializer(typeof(RootObject)); 
    RootObject rootObject = (RootObject)root.ReadObject(e.Result); 

    foreach (var myClass in rootObject.response) 
    { 
     audioList.Add(new MyDataClass(myClass.artist, myClass.duration)); 
    } 

    MyListBox.ItemsSource = audioList; 
} 

#region JsonDataClass 
public class Response 
{ 
    public string artist { get; set; } 
    public int duration { get; set; } 
} 

public class RootObject 
{ 
    public List<Response> response { get; set; } 
} 
#endregion 
Смежные вопросы