Xamarin Forms-如何在ListView中显示JSON数组?

时间:2018-10-06 03:20:33

标签: c# xaml xamarin xamarin.forms xamarin.android

如何将JSON数组显示到ListView,我很困惑有人可以帮助我吗? 我尝试了这些代码,但无法正常工作。

我的JSON数组

 {"table":[
    {"table_no":"1","order_status":"served"},
    {"table_no":"2","order_status":"pending"},
    {"table_no":"3","order_status":"served"},
    {"table_no":"4","order_status":"served"},
    {"table_no":"8","order_status":"served"},
    {"table_no":"10","order_status":"served"},
    {"table_no":"11","order_status":"served"},
    {"table_no":"12","order_status":"served"},
    {"table_no":"14","order_status":"pending"},
    {"table_no":"16","order_status":"served"}]}

OrderStat.cs 我如何绑定它或如何反序列化它?

  public class OrderStat
    {
        public string table_no { get; set; }
        public string order_status { get; set; }
    }

    public class RootObject
    {
        public List<OrderStat> table { get; set; }
    }

OrderStatus.xaml

    <ListView x:Name="selectOrd" RowHeight="50" SeparatorColor="White" 
                  HasUnevenRows="True">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell >
                        <StackLayout   Orientation="Horizontal"  >
                            <StackLayout Orientation="Horizontal" VerticalOptions="Center">
                                <Image Source="table.png" Scale="1"/>
                                <Label  Text="{Binding table_no,StringFormat='  Table no.{0:F0}'}"  Font="30" TextColor="White" />
                            </StackLayout>
                            <StackLayout HorizontalOptions="FillAndExpand"  x:Name="BG" VerticalOptions="Center"  >
                                <Label  Text="{Binding order_status}" Font="50" TextColor="White"   FontAttributes="Bold" HorizontalTextAlignment="Center"/>
                            </StackLayout>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

OrderStatus.xaml.cs

   private async void GetStat()
            {
                HttpClient client = new HttpClient();
                var response = await client.GetStringAsync("http://ropenrom2-001-site1.etempurl.com/Restserver/index.php/customer/view_table_orders");

                var stat = JsonConvert.DeserializeObject<List<RootObject>>(response);

                  selectOrd.ItemsSource = stat;
            }

2 个答案:

答案 0 :(得分:0)

您好,您没有定义选择顺序,也没有定义对象     从JSON检索的应该是OrderStat。下面是已编辑的代码

<StackLayout BackgroundColor="White">
    <ListView x:Name="ListView1" RowHeight="60">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Orientation="Vertical" Padding="8,0,8,0">
                        <Label Text="{Binding ArticleTitle}" TextColor="#000" FontSize="14" LineBreakMode="TailTruncation" />
                        <Label Text="{Binding description}" TextColor="#000" LineBreakMode="TailTruncation" />
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

private async void GetStat()
            {
                HttpClient client = new HttpClient();
                var response = await client.GetStringAsync("http://ropenrom2-001-                       site1.etempurl.com/Restserver/index.php/customer/view_table_orders");

                var stat = JsonConvert.DeserializeObject<List<OrderStat>>(response);
        ListView1.ItemsSource = stat; 
                 // selectOrd.ItemsSource = stat;
            }

答案 1 :(得分:0)

这是在ListView中显示json的正确方法。我也更新了您的Xaml。我刚刚从您的ListView中删除了白色文本颜色和x:Name。

Xaml

 <ListView x:Name="selectOrd" RowHeight="50" SeparatorColor="White" 
              HasUnevenRows="True">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Orientation="Horizontal"  >
                        <StackLayout Orientation="Horizontal" VerticalOptions="Center">
                            <Image Source="table.png" Scale="1"/>
                            <Label  Text="{Binding table_no,StringFormat='Table no.{0:F0}'}" Font="30" />
                        </StackLayout>
                        <StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="Center"  >
                            <Label  Text="{Binding order_status}" Font="50" FontAttributes="Bold" HorizontalTextAlignment="Center"/>
                        </StackLayout>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

OrderStat类

[DataContract]
public class OrderStat
{
    [DataMember]
    public string table_no { get; set; }
    [DataMember]
    public string order_status { get; set; }
}

[DataContract]
public class RootObject
{
    [DataMember]
    public List<OrderStat> table { get; set; }
}

MainPage.xaml.cs

 public MainPage()
    {
        InitializeComponent();

        GetStat();
    }

    private async void GetStat()
    {
        HttpClient client = new HttpClient();
        var response = await client.GetAsync("http://ropenrom2-001-site1.etempurl.com/Restserver/index.php/customer/view_table_orders");
        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);

        selectOrd.ItemsSource = data.table;
    }