Как использовать многоуровневый JSON в отчете

29.06.2019

Несмотря на то, что FastReport.Net предоставляет нам плагин дизайнера отчетов для использования в качестве источника данных файла JSON, все же не всегда он подходит. Этот плагин хорошо работает с одноуровневыми данными, представляющими отдельную таблицу. В случаях же, когда данные имеют множество уровней вложенности, придется прибегнуть к другому решению.

 Например, использование библиотеки Newtonsoft.Json - с ее помощью можно получить данные из JSON, сформировать из них список зарегистрировать его в отчёте из кода.

 Давайте рассмотрим все на примере. Создадим приложение WinForms. С помощью NuGet менеджера устанавливаем пакет Newtonsoft.Json. В Reference добавляем ссылку на библиотеку FastReport.dll.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
{
 "Shops": [{
 "Name": "First shop",
 "Managers": [{
 "Name": "John",
 "Phone": "45443446343",
 "Sales": [{
 "GoodId": "1",
 "Amount": "3"
 },
 {
 "GoodId": "2",
 "Amount": "5"
 },
 {
 "GoodId": "3",
 "Amount": "2"
 }
 ]
 },
 {
 "Name": "Boris",
 "Phone": "8787964387",
 "Sales": [{
 "GoodId": "15",
 "Amount": "8"
 },
 {
 "GoodId": "12",
 "Amount": "2"
 },
 {
 "GoodId": "13",
 "Amount": "2"
 }
 ]
 }
 ]
 },
 {
 "Name": "Second shop",
 "Managers": [{
 "Name": "Julia",
 "Phone": "5555555555",
 "Sales": [{
 "GoodId": "1",
 "Amount": "30"
 }]
 },
 {
 "Name": "Helen",
 "Phone": "8787964387",
 "Sales": [{
 "GoodId": "2",
 "Amount": "8"
 },
 {
 "GoodId": "3",
 "Amount": "26"
 },
 {
 "GoodId": "1",
 "Amount": "2"
 }
 ]
 }
 ]
 }
 ]
}

Чтобы десериализовать эти данные, нам потребуются объекты, со свойствами, соответствующими полям в JSON.

Да, если JSON документ имеет действительно глубокую вложенность, создание классов может быть весьма утомительно . Поэтому существует прекрасный веб сервис http://json2csharp.com/. Вы просто помещаете в поле ввода свой валидный json, нажимаете кнопку Generate, и получаете готовые классы C#. Для нашего json документа будет сгенерирован следующий набор классов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Sale
 {
 public string GoodId { get; set; }
 public string Amount { get; set; }
 }
 
 public class Manager
 {
 public string Name { get; set; }
 public string Phone { get; set; }
 public List<Sale> Sales { get; set; }
 }
 
 public class Shop
 {
 public string Name { get; set; }
 public List<Manager> Managers { get; set; }
 }
 
 public class RootObject
 {
 public List<Shop> Shops { get; set; }
 }

Давайте создадим для них отдельный файл Sales.cs.

Добавим на форму кнопку. Для события нажатия на нее создадим обработчик:

1
2
3
4
5
6
7
private void RunBtn_Click(object sender, EventArgs e)
 {
 var json = JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(@"Sales.json"));
 Report report = new Report();
 report.RegisterData(json.Shops,"Shops");
 report.Design(); 
 }

Как видите, здесь мы используем библиотеку Newtonsoft.json для десериализации json в объект RootObject, который имеет свойство Shops, представляющее собой список магазинов. Регистрируем этот список в отчете, как источник данных.  И вызываем дизайнер отчетов. Запустим наше приложение с единственной кнопкой и нажмем ее. Появится дизайнер отчетов с пустым отчетом. Выберем источник данных отчета:

 

На основе этих данных создадим шаблон отчета:

Как видите, бэнд Данные имеет дочерний, а тот в свою очередь имеет еще один дочерний бэнд Данные.

Данные на этих бэнда размещены согласно иерархии в источнике данных. Запустим отчет:

 

Таким образом мы получили связанные данные в отчете типа Master-Detail. И нам не нужно создавать специальные связи между таблицами для получения зависимостей. В случае большой вложенности данных в JSON, лучше использовать рассмотренный нами подход.

1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.
28 октября 2024

Как настроить WSL 2 для работы с FastReport и FastCube

В этой статье попробуем вместе разобраться, как настроить WSL 2 для работы с компонентами FastReport и FastCube в Lazarus для Linux.