首页 > 解决方案 > 在 SSIS 中使用 JSONPath 表达式获取每个子节点及其值

问题描述

我正在与 SSIS 和 ZappySys 合作将数据导出到我们的数据库。

从 REST API 源(ZappySys 组件)我得到以下响应:

{
    "data": [
        {
            "id" : "1",
            "name" : "a"
            "children" : [
                {
                    id" : "11",
                    "name" : "aa"
                    "children" : []
                },
                {
                    id" : "12",
                    "name" : "ab"
                    "children" : []
                }
            ]
        },
        {
            "id" : "2",
            "name" : "b"
            "children" : [
                {
                    id" : "21",
                    "name" : "ba"
                    "children" : [
                        {
                            id" : "211",
                            "name" : "baa"
                            "children" : []
                        }
                    ]
                },
                {
                    id" : "22",
                    "name" : "bb"
                    "children" : []
                }
            ]
        }
    ]
}

我想过滤此响应以从父母、每个孩子、孙子、...

所以它应该是这样的:

id    name
----------
1     a
11    aa
12    ab
2     b
21    ba
211   baa
22    bb

是否有任何 jsonpath 表达式可以解决这个问题?或者,当然,SSIS 中任何其他不包含 Skriptcomponent 的解决方案?

谢谢!

标签: arraysjsonssisnested

解决方案


免责声明:我为ZappySys工作。

要实现您的要求,您需要使用 2 JSON Source 和 Union All Transform,如下所示

假设您有以下示例 JSON(JSON 源上的直接值模式)(我更正了一些丢失的双引号和逗号。

{
    "data": [
        {
            "id" : "1",
            "name" : "a",
            "children" : [
                {
                    "id" : "11",
                    "name" : "aa",
                    "children" : []
                },
                {
                    "id" : "12",
                    "name" : "ab",
                    "children" : []
                }
            ]
        },
        {
            "id" : "2",
            "name" : "b",
            "children" : [
                {
                    "id" : "21",
                    "name" : "ba",
                    "children" : [
                        {
                            "id" : "211",
                            "name" : "baa",
                            "children" : []
                        }
                    ]
                },
                {
                    "id" : "22",
                    "name" : "bb",
                    "children" : []
                }
            ]
        }
    ]
}
  1. 拖动第一个 ZS JSON Source 并配置 Filter= $.data[*],取消选中 Include Parent 选项。单击确定保存。将其重命名为读取数据节点
  2. 拖动第二个 ZS JSON 源并配置 Filter= $..children[*](注意:过滤器中的双点表示任何名称为子级的递归节点),取消选中包含父级选项。单击确定保存。将组件重命名为读取子节点
  3. 拖动联合所有变换。
  4. 将两个 JSON 源都连接到 Union All
  5. 双击 Union ALL 以确保两个列名都已映射(即 id、name),否则您将在下游获得 NULL
  6. 将 Union ALL 连接到某个目的地(我们使用了 ZS Trash 目的地)
  7. 右键单击路径并添加数据查看器。运行示例

查看本文以阅读有关双点 JSONPath 表达式的更多信息

递归提取 JSON Array 数据


推荐阅读