您当前的位置: 首页 >  json

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

寒冰屋 发布时间:2022-05-04 21:03:40 ,浏览量:1

目录

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类进行转换

  • 下载 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 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("companies.json"))
    {
        using (var w = new ChoJSONWriter("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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0462s