Несмотря на то, что 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, лучше использовать рассмотренный нами подход.