Cinchoo ETL——扁平化复杂的嵌套JSON对象

本文介绍了如何使用Cinchoo ETL .NET框架将具有复杂嵌套结构的JSON文件转换为扁平化格式。通过示例代码展示了快速转换和使用POCO类进行转换的方法,适用于大数据处理和ETL流程。

目录

1、简介

2. 要求

3. 如何使用

3.1 样本数据

清单 3.1.1 示例JSON文件(company.json)

3.2 安装库

.NET Standard Framework

.NET Core

3.3 快速转换

清单 3.3.1 快速JSON文件转换

3.4 使用POCO转换

清单 3.4.1 POCO类

清单 3.4.2 使用POCO类进行转换


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值