Регистрация Json данных в FastReport.NET

23.03.2015
Если вам необходимо зарегистрировать Json как источник данных в FastReport.NET, то это можно сделать через регистрацию бизнес-объектов.
Для парсинга json нужно описать схему данных в виде C# классов, например:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 public class Product
 {
 public string Name { get; set; }
 public double UnitPrice { get; set; }
 }
 
 public class Category
 {
 public string Name { get; set; }
 public string Description { get; set; }
 public List<Product> Products { get; set; }
 }
 
 string json = "..."; // строка с вашим json
 
 List<Category> categories = JsonConvert.DeserializeObject<List<Category>>(json); // используем библиотеку Newtonsoft.Json для десериализации
 
 Report report = new Report();
 report.Load(@"C:\report.frx");
 report.RegisterData(categories, "Categories");
Если же вам изначально неизвестна схема, или она изменяется в процессе работы программы, то её можно сгенерировать динамически. Для этого воспользуемся библиотекой JSON C# Class Generator, скачать её можно с сайта https://jsonclassgenerator.codeplex.com.
Код для генерации C# классов:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 string json = "..."; // строка с вашим json
 
 if (json.StartsWith("[")) // если json является массивом, то будет лучше, если мы дадим ему имя
 {
 json = "{\"Data\":" + json + "}"; // под этим название данные будут отображаться в дизайнере, таким образом, можно добавить сразу несколько источников данных
 }
 JsonClassGenerator gen = new JsonClassGenerator()
 {
 Example = json,
 UseProperties = true,
 Namespace = "__JSON__",
 MainClass = "__JSON__",
 };
 
 string source = "";
 using (StringWriter sw = new StringWriter())
 {
 gen.OutputStream = sw;
 gen.GenerateClasses();
 sw.Flush();
 source = sw.ToString(); // теперь в source находятся C# классы
 }
В результате мы получим сгенерированные классы в виде строки. Теперь к ним нужно получить доступ из кода; для этого скомпилируем их с помощью CSharpCodeProvider и получим Type:
1
2
3
4
5
6
7
8
9
10
 Type type = null;
 using (CSharpCodeProvider compiler = new CSharpCodeProvider())
 {
 CompilerParameters parameters = new CompilerParameters()
 {
 GenerateInMemory = true,
 };
 CompilerResults results = compiler.CompileAssemblyFromSource(parameters, source);
 type = results.CompiledAssembly.GetType("__JSON__.__JSON__");
 }
Внимание: в этом примере показана компиляция в текущем AppDomain. Это означает, что её нельзя выгрузить из памяти, и каждая компиляция будет отъедать память. Чтобы избежать этого, вы можете использовать CSharpCodeProvider в другом AppDomain.

С помощью сгенерированных классов десериализуем json. Проще всего это сделать, используя библиотеку Newtonsoft.Json; получить её можно через NuGet с помощью команды "Install-Package Newtonsoft.Json".
1
 object obj = JsonConvert.DeserializeObject(json, type);
Теперь, когда мы получили объекты, зарегистрируем их в FastReport.NET:
1
2
3
4
5
6
7
8
9
 PropertyInfo[] properties = type.GetProperties();
 
 Report report = new Report();
 report.Load(@"C:\report.frx");
 
 foreach (var prop in properties)
 {
 report.RegisterData((IList)prop.GetValue(obj, null), prop.Name);
 }

 Теперь вы можете запустить дизайнер и увидеть результаты.

Data

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
1 ноября 2024

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

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

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

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