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