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

目录

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值