目录
清单 3.1.1 示例JSON文件(company.json)
- 下载 Cinchoo ETL 源码
- 下载 Cinchoo ETL 二进制文件 (.NET Core)
- 下载 Cinchoo ETL 二进制文件 (.NET Framework)
- 工作示例 1(.NET Fiddle)
- 工作示例 2 (.NET Fiddle)
1、简介
ChoETL是一个用于.NET的开源ETL(提取、转换和加载)框架。它是一个基于代码的库,用于在.NET环境中从多个来源提取数据、转换并加载到您自己的数据仓库中。您可以立即在数据仓库中获取数据。
这个技巧讨论了使用Cinchoo ETL框架扁平化复杂的嵌套JSON文件。使用非常简单,几行代码就可以完成转换。您可以转换大文件,因为转换过程是基于流的,速度非常快且内存占用少。
2. 要求
该框架库是使用.NET 4.5/.NET Core 3.x框架用C#编写的。
3. 如何使用
3.1 样本数据
让我们从以下包含复杂嵌套结构的JSON文件开始。比如说,我们有两家公司,第一家有两个分公司,第二家只有一个分公司。
清单 3.1.1 示例JSON文件(company.json)
[
{
"ID": "1",
"Name": "C1",
"Branches": [
{
"City": "New York",
"Country": "USA"
},{
"City": "California",
"Country": "USA"
}
]
},
{
"ID": "2",
"Name": "C2",
"Branches": [
{
"City": "Mexico City",
"Country": "Mexico"
}
]
}
]
我们将使用Cinchoo ETL框架进行扁平化,得到如下表所示的结果:
ID | 名称 | 分支机构/0/城市 | 分支机构/0/国家 | 分店/1/市 | 分支机构/1/国家 |
1 | C1 | New York | USA | California | USA |
2 | C2 | Mexico City | Mexico | null | null |
预期的JSON输出如下所示:
[
{
"ID": "1",
"Name": "C1",
"Branches/0/City": "New York",
"Branches/0/Country": "USA",
"Branches/1/City": "California",
"Branches/1/Country": "USA"
},
{
"ID": "2",
"Name": "C2",
"Branches/0/City": "Mexico City",
"Branches/0/Country": "Mexico",
"Branches/1/City": null,
"Branches/1/Country": null
}
]
3.2 安装库
接下来,安装ChoETL.JSON/ChoETL.JSON.NETStandard nuget包。为此,请在包管理器控制台中运行以下命令。
.NET Standard Framework
Install-Package ChoETL.JSON
.NET Core
Install-Package ChoETL.JSON.NETStandard
现在将ChoETL命名空间添加到程序中。
using ChoETL;
3.3 快速转换
让我们使用该库将复杂的结构化JSON文件转换为扁平格式。它很简单,只需几行代码即可完成。不需要POCO类。它速度快、基于流且占用内存少。
清单 3.3.1 快速JSON文件转换
private static void QuickConversion()
{
using (var r = new ChoJSONReader.LoadText("companies.json"))
{
using (var w = new ChoJSONWriter("companies_out.json")
.Configure(c => c.ThrowAndStopOnMissingField = false)
.Configure(c => c.FlattenNode = true)
.Configure(c => c.DefaultArrayHandling = false)
.Configure(c => c.NestedKeySeparator = '/')
.WithMaxScanNodes(3)
)
w.Write(r);
}
}
创建一个用于生成扁平化JSON(company_out.json)输出文件的ChoJSONWriter实例。然后创建一个ChoJSONReader对象实例来读取复杂的JSON(company.json)文件。
其中:
- Configure(c => c.FlattenNode = true)——告诉writer扁平化json
- Configure(c => c.ThrowAndStopOnMissingField = false)——将writer配置为在写入时忽略缺失的字段。在上面的示例中,第二个节点带有1个分支对象,但希望输出带有null值的第二个分支。
- Configure(c => c.NestedKeySeparator = '/')——告诉writer'/'用作嵌套键分隔符。
- Configure(c => c.DefaultArrayHandling = false)——告诉writer关闭将空节点视为简单对象(而不是数组)。
- WithMaxScanNodes(3)——告诉writer扫描节点数以发现输出扁平化JSON所需的最佳最大字段数。
Fiddle示例:https ://dotnetfiddle.net/uzZdKU
3.4 使用POCO转换
此方法使用POCO模型类来加载JSON文件。首先,定义与Companies.json文件匹配的POCO类。
清单 3.4.1 POCO类
public class Company
{
public string ID { get; set; }
public string Name { get; set; }
public List<Branch> Branches { get; set; }
}
public class Branch
{
public string City { get; set; }
public string Country { get; set; }
}
清单 3.4.2 使用POCO类进行转换
private static void SelectiveColumnTest()
{
using (var r = new ChoJSONReader<Company>("companies.json"))
{
using (var w = new ChoJSONWriter<Company>("companies_out.json")
.Configure(c => c.FlattenNode = true)
.Configure(c => c.ThrowAndStopOnMissingField = false)
.Configure(c => c.NestedKeySeparator = '/')
.WithMaxScanNodes(3)
)
w.Write(r);
}
}
创建一个用于生成扁平化JSON(company_out.json)输出文件的ChoJSONWriter实例。然后创建一个ChoJSONReader对象实例来读取复杂的JSON ( company.json)文件。
其中:
- Configure(c => c.FlattenNode = true)——告诉writer扁平化json
- Configure(c => c.ThrowAndStopOnMissingField = false)——将writer配置为在写入时忽略缺失的字段。在上面的示例中,第二个节点带有1个分支对象,但希望输出带有null值的第二个分支。
- Configure(c => c.NestedKeySeparator = '/')——告诉writer'/'用作嵌套键分隔符。
- WithMaxScanNodes(3)——告诉writer者扫描节点数以发现输出平坦JSON所需的最佳最大字段数。
Fiddle示例:https ://dotnetfiddle.net/AX02BN
https://www.codeproject.com/Tips/5316047/Cinchoo-ETL-Flattening-Complex-Nested-JSON-Objects