**["Получение данных из внешних источников.JSON."](https://github.com/kolei/OAP/blob/master/articles/lab_wpf_data_json.md)**
***
**C#**
***
**Class1**
***
```
using System;
using WpfApp1;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp1.model
{
    [DataContract]
    public class cars
    {
        [DataMember]
        public string name { get; set; }
        [DataMember]
        public int year { get; set; }
        [DataMember]
        public double price { get; set; }
        [DataMember]
        public string color { get; set; }
        [DataMember]
        public bool defects { get; set; }
        [DataMember]
        public DateOnly? dateOfLastSTO { get; set; }
        [DataMember]
        public string? photo { get; set; }
    }
}
```
***
**Class2**
***
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp1.model
{
    class Globals
    {
        public static IDataProvider dataProvider;
        IEnumerable<Namecar> getNamecar()
        {
            return new Namecar[] {
                new Namecar { title = "Toyota Trueno AE8"},
                new Namecar { title = "Toyota Supra A80"},
                new Namecar { title = "Nissal Skyline R34" },
                new Namecar { title = "Nissan Silvia S15"},
                new Namecar { title = "Toyota Camry 3.5"},
                new Namecar { title = "Audi RS 6" },
                new Namecar { title = "Трактор LOVOL TE354 HT"},
                new Namecar { title = "BMW M5 F90"},
                new Namecar { title = "BMW E36" },
                new Namecar { title = "Daewoo Matiz" }
            };
        }
        IEnumerable<Carsprice> getCarsprice()
        {
            return new Carsprice[] {
                new Carsprice{title="Малая цена", priceFrom=0, priceTo=15001},
                new Carsprice{title="Средняя цена", priceFrom = 20000, priceTo=35000},
                new Carsprice{title="Высокая цена", priceFrom = 35001, priceTo=70000},
            };
        }
    }
}
```
***
**Class3**
***
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp1.model
{
    public class Carsprice
    {
        public string title { get; set; }
        public int priceFrom { get; set; }
        public int priceTo { get; set; }
    }
    public class Namecar
    {
        public string title { get; set; }
    }
}
```
***
**Class4**
***
```
using Newtonsoft.Json;
using System;
using WpfApp1;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp1.model
{
    public class JSONDataProvider : LocalDataProvider, IDataProvider
    {
        private List<CarWithStringDates> _CarList;

        public JSONDataProvider()
        {
            using (var sr = new StreamReader("./Test.json"))
            {
                _CarList = JsonConvert.DeserializeObject<CarWithStringDates[]>(sr.ReadToEnd()).ToList();

            }
        }

        public new IEnumerable<cars> getCars()
        {
            return _CarList.Select(p => new cars
            {
                name = p.name,

                year = p.year,

                price = p.price,

                color = p.color,

                defects = p.defects,

                photo = p.photo,

                dateOfLastSTO = p.dateOfLastSTO == null ? null : DateOnly.Parse(p.dateOfLastSTO),
                
            });
        }
    }
}

```
***
**Class5**
***
```
using System;
using WpfApp1;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp1.model
{
    [DataContract]
    public class CarWithStringDates : cars
    {
        [DataMember]
        public string? dateOfLastSTO { get; set; }
    }
}

```
***
**Test.json**
***
```
[
	{
		"name": "Toyota Trueno AE86",
		"year": 1995,
		"price": 15000,
		"color": "white",
		"defects": false,
		"dateOfLastSTO": "2024-12-05",
		"photo": null
	},
	{
		"name": "Toyota Supra A80",
		"year": 1996,
		"price": 30000,
		"color": "white",
		"defects": false,
		"dateOfLastSTO": "2023-10-02",
		"photo": null
	},
	{
		"name": "Nissal Skyline R34",
		"year": 1996,
		"price": 25000,
		"color": "gray",
		"defects": false,
		"dateOfLastSTO": "2024-11-05",
		"photo": null
	},
	{
		"name": "Toyota Camry 3.5",
		"year": 2020,
		"price": 20000,
		"color": "black",
		"defects": false,
		"dateOfLastSTO": "2022-12-10",
		"photo": null
	},
	{
		"name": "Audi RS 65",
		"year": 2016,
		"price": 30000,
		"color": "black",
		"defects": false,
		"dateOfLastSTO": "2023-12-07",
		"photo": null
	},
	{
		"name": "Трактор LOVOL TE354 HT",
		"year": 2024,
		"price": 66666,
		"color": "blue",
		"defects": false,
		"dateOfLastSTO": "2021-12-10",
		"photo": null
	},
	{
		"name": "BMW M5 F90",
		"year": 2019,
		"price": 30000,
		"color": "red",
		"defects": false,
		"dateOfLastSTO": "2024-04-10",
		"photo": null
	},
	{
		"name": "BMW E36",
		"year": 2006,
		"price": 35000,
		"color": "black",
		"defects": false,
		"dateOfLastSTO": "2019-12-17",
		"photo": null
	},
	{
		"name": "Daewoo Matiz",
		"year": 2010,
		"price": 20000,
		"color": "blue",
		"defects": false,
		"dateOfLastSTO": "2021-12-10",
		"photo": null
	}
]
```
***
**MainWindow.xaml.cs**
***
```
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using WpfApp1.model;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>

    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private string searchFilter = "";

        private void SearchFilter_KeyUp(object sender, KeyEventArgs e)
        {
            searchFilter = SearchFilterTextBox.Text;
            Invalidate();
        }
        private bool sortAsc = true;

        private void RadioButton_Checked(object sender, RoutedEventArgs e)
        {
            sortAsc = (sender as RadioButton).Tag.ToString() == "1";
            Invalidate();
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void Invalidate()
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("CarList"));
        }
        public string selectedname = "Все автомобили";
        public Carsprice? selectedprice = null;

        private IEnumerable<cars> _CarList;
        public IEnumerable<cars> CarList
        {
            get
            {
                var res = _CarList;

                res = res
                    .Where(c => (c.name == selectedname || selectedname == "Все автомобили"))
                    .Where(c => (selectedprice == null || (c.price >= selectedprice.priceFrom && c.price < selectedprice.priceTo)));

                if (searchFilter != "")
                    res = res.Where(c => c.name.IndexOf(
                        searchFilter,
                        StringComparison.OrdinalIgnoreCase) >= 0);
                if (sortAsc) res = res.OrderBy(c => c.year);
                else res = res.OrderByDescending(c => c.year);

                return res;

            }
            set
            {
                _CarList = value;
            }
        }
        public List<cars> Cars { get; set; }
        public List<Namecar> CarinfoList { get; set; }
        public List<Carsprice> CarpriceList { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            Globals.dataProvider = new JSONDataProvider();
            CarList = Globals.dataProvider.getCars();
            CarinfoList = Globals.dataProvider.getName().ToList();
            CarinfoList.Insert(0, new Namecar { title = "Все автомобили" });
            CarpriceList = Globals.dataProvider.getPrice().ToList();
        }

        private void ExitButton_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.Shutdown();

        }

        private void carnameFilterComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            selectedname = (carnameFilterComboBox.SelectedItem as Namecar).title;
            Invalidate();
        }
        private void carpriceFilterComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            selectedprice = carpriceFilterComboBox.SelectedItem as Carsprice;
            Invalidate();
        }
    }
    interface IDataProvider
    {
        IEnumerable<cars> getCars();
        IEnumerable<Namecar> getName();
        IEnumerable<Carsprice> getPrice();
    }
    public class LocalDataProvider : IDataProvider
    {
        public IEnumerable<Namecar> getName()
        {
            return new Namecar[]
            {
                new Namecar()
                {
                    title="Toyota Trueno AE86"

                },
                new Namecar()
                {
                    title="Toyota Supra A80"
                },
                new Namecar()
                {
                    title="Nissal Skyline R34"
                },
                new Namecar()
                {
                    title="Nissan Silvia S15"

                },
                new Namecar()
                {
                    title="Toyota Camry 3.5"
                },
                new Namecar()
                {
                    title="Audi RS 6"

                },
                new Namecar()
                {
                    title="Трактор LOVOL TE354 HT"
                },
                new Namecar()
                {
                    title="BMW M5 F90"
                },
                new Namecar()
                {
                    title="BMW E36"
                },
                new Namecar()
                {
                    title="Daewoo Matiz"
                }
            };
        }
        public IEnumerable<Carsprice> getPrice()
        {
            return new Carsprice[]
            {
                new Carsprice()
                {
                    title="Все цены",
                    priceFrom=0,
                    priceTo=70000
                },
                new Carsprice()
                {
                    title="Малая цена",
                    priceFrom=0,
                    priceTo=15001

                },
                new Carsprice()
                {
                    title="Средняя цена",
                    priceFrom=20000,
                    priceTo=35000

                },
                new Carsprice()
                {
                    title="Высокая цена",
                    priceFrom=35001,
                    priceTo=70000

                }
            };
        }
        public IEnumerable<cars> getCars()
        {
            return new cars[] {
                new cars {
                price = 15000,
                name = "Toyota Trueno AE86",
                year = 1995,
                },
                new cars {
                price = 30000,
                name = "Toyota Supra A80",
                year = 1996,
                },
                new cars {
                price = 25000,
                name = "Nissal Skyline R34",
                year = 1996
                },
                new cars {
                price = 20000,
                name = "Nissan Silvia S15",
                year = 1999,
                },
                new cars {
                price = 20000,
                name = "Toyota Camry 3.5",
                year = 2020,
                },
                new cars {
                price = 30000,
                name = "Audi RS 6",
                year = 2016,
                },
                new cars {
                price = 66666,
                name = "Трактор LOVOL TE354 HT",
                year = 2024,
                },
                new cars {
                price = 30000,
                name = "BMW M5 F90",
                year = 2019,
                },
                new cars {
                price = 35000,
                name = "BMW E36",
                year = 2006,
                },
                new cars {
                price = 20000,
                name = "Daewoo Matiz",
                year = 2010,
                },
            };
        }
    }
} 
```
***
**MainWindow.xaml**
***
```
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="Иванов Валера И-21" Height="450" Width="908">
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition />
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <!-- лого -->
        <Image 
        Source="./img/net.jpg" 
        Grid.RowSpan="2" HorizontalAlignment="Right"/>
        <DataGrid
    Grid.Row="1"
    Grid.Column="1"
    CanUserAddRows="False"
    AutoGenerateColumns="False"
    ItemsSource="{Binding CarList}">
            <DataGrid.Columns>
                <DataGridTextColumn
            Header="Название"
            Binding="{Binding name}"/>
                <DataGridTextColumn
            Header="Год"
            Binding="{Binding year}"/>
                <DataGridTextColumn
            Header="Цена"
            Binding="{Binding price}"/>
                <DataGridTextColumn
            Header="Цвет"
            Binding="{Binding color}"/>
                <DataGridTextColumn
            Header="Повреждения"
            Binding="{Binding defects}"/>
                <DataGridTextColumn
            Header="Дата СТО"
            Binding="{Binding dateOfLastSTO}"/>
            </DataGrid.Columns>
        </DataGrid>
        <StackPanel 
        Orientation="Vertical"
        Grid.RowSpan="3"
        VerticalAlignment="Bottom">
            <Button 
            x:Name="ExitButton"
            Content="Выход" 
            Click="ExitButton_Click"
            Height="50"/>
        </StackPanel>


        <WrapPanel
        Orientation="Horizontal"
        Grid.Column="1"
        MinHeight="50">
            <Label 
    Content="Поиск" 
    VerticalAlignment="Center"/>
            <TextBox
    Width="200"
    VerticalAlignment="Center"
    x:Name="SearchFilterTextBox" 
    KeyUp="SearchFilter_KeyUp"/>

            <Label 
    Content="Название:"
    VerticalAlignment="Center"/>

            <ComboBox
    Name="carnameFilterComboBox"
    SelectionChanged="carnameFilterComboBox_SelectionChanged"
    VerticalAlignment="Center"
    MinWidth="100"
    SelectedIndex="0"
    ItemsSource="{Binding CarinfoList}">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <Label
                Content="{Binding title}"/>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
            <Label 
Content="Цена:"
VerticalAlignment="Center"/>

            <ComboBox
Name="carpriceFilterComboBox"
SelectionChanged="carpriceFilterComboBox_SelectionChanged"
VerticalAlignment="Center"
MinWidth="100"
SelectedIndex="0"
ItemsSource="{Binding CarpriceList}">

                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <Label 
            Content="{Binding title}"/>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
            <Label 
    Content="Возраст:" 
    VerticalAlignment="Center"/>
            <RadioButton
    GroupName="Age"
    Tag="1"
    Content="по возрастанию"
    IsChecked="True"
    Checked="RadioButton_Checked"
    VerticalAlignment="Center"/>
            <RadioButton
    GroupName="Age"
    Tag="2"
    Content="по убыванию"
    Checked="RadioButton_Checked"
    VerticalAlignment="Center"/>
        </WrapPanel>
    </Grid>
</Window>

```
***
**Вот что получилось**
***
![](./img/qqq.png)