Как использовать JSON для заполнения ObservableCollection? - PullRequest
0 голосов
/ 05 февраля 2019

Как заполнить ObservableCollection с помощью JSON?Теперь в настольном приложении есть только сам скрипт и модель.Я не могу понять, как связать это.Я получаю его после запуска скрипта:

{
"records": [
    {
        "brand_id": "1",
        "brand_name": "Gigabyte"
    },
    {
        "brand_id": "2",
        "brand_name": "MSI"
    },
    {
        "brand_id": "3",
        "brand_name": "Lenovo"
    },
    {
        "brand_id": "4",
        "brand_name": "Dell"
    },
    {
        "brand_id": "5",
        "brand_name": "Google"
    }
]}

И у меня есть модель в приложении:

public class Brands
{
    int brand_id;
    string brand_name;

    public int Brand_id { get => brand_id; set => brand_id = value; }
    public string Brand_name { get => brand_name; set => brand_name = value; }
}

И коллекция:

public class BrandsCollection
{
    private ObservableCollection<Brands> brands;

    public ObservableCollection<Brands> Brands { get => brands; set => brands = value; }
}

1 Ответ

0 голосов
/ 05 февраля 2019

Это довольно просто, особенно с пакетами, доступными, чтобы упростить большую часть работы.Пакет Nuget System.Net.Http будет содержать пакеты, необходимые для создания JSON HttpClient до Get() из Интернета.Я рекомендую Newtonsoft.Json проанализировать JSON в объекте C #.И затем, имея объект, вам просто нужно установить DataGrid.ItemSource как массив объектов любого типа, чтобы он мог генерировать столбцы.

Простой пример:

Сначала вы должны определитьпростое объектное представление ваших данных JSON.Например, если у вас были следующие данные:

[
  {
    "Name":"Test",
    "Data": ["Item1","Item2"]
  },
  {
    "Name":"Test 2",
    "Data": ["Item3","Item4"]
  }
]

Вы должны создать эквивалентное представление C #.По сути, это список объектов:

public class OuterObject : List<InnerObject> {}

Внутренний объект выглядит следующим образом:

public class InnerObject {
  public string Name { get; set; }
  public List<string> Data { get; set; }
}

Определив объекты, вы можете сделать что-то вроде:

HttpClient client = new HttpClient { BaseAddress = new Uri("ADDRESS") };
var json = await client.GetAsync("/ENDPOINT");
JsonSerializer serializer = JsonSerializer.CreateDefault();

using (StringReader reader = new StringReader(json))
{
     using (JsonTextReader jsonReader = new JsonTextReader(reader))
     {
          var result = serializer.Deserialize<OuterObject>(jsonReader);
     }
}

Затем, чтобы получить доступ к данным в вашей программе, вы можете получить к ним следующий доступ:

string name = result[0].Name;

или установить значение DataGrid's ItemSource, чтобы данные волшебным образом отображались.

grid1.ItemSource = result;

Пока в результате получается массив элементов, он будет создавать по строке для каждого элемента.Вы можете указать, какие элементы показывать, но это делается путем изменения DataGrid.Columns определений и настроек DataGrid.AutogenerateColumns = false

РЕДАКТИРОВАТЬ: с вашими данными и моделями

//Just a small change to the Collection
public class BrandsCollection {
    private ObservableCollection<Brands> _records;

    public ObservableCollection<Brands> records { get => _records; set => _records= value; }
}

И для анализаdata ...

JsonSerializer serializer = JsonSerializer.CreateDefault();

using (StringReader reader = new StringReader(json))
{
     using (JsonTextReader jsonReader = new JsonTextReader(reader))
     {
          var result = serializer.Deserialize<BrandsCollection>(jsonReader);
     }
}

Вы должны помнить, чтобы использовать те же имена, что и метки json, либо использовать атрибуты Json.Для получения дополнительной информации об этом вы можете перейти к официальной документации Newtonsoft.Json

...