Если вам необходимо зарегистрировать 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); } |
Теперь вы можете запустить дизайнер и увидеть результаты.