如何使用 Pentaho Spoon 6 JSON 输入读取多层嵌套 JSON 文件

问题描述 投票:0回答:1

我有一个包含多个子级别的 JSON 文件,需要使用 PDI 进行解析。让我陷入困境的棘手之处是嵌套数组中的一对多关系。

这是我的 JSON 示例:

{
    "@gdata.count": "139111",
    "value": [
        {
            "InvStatus": {
                "Description": "Active"
            },
            "DeviceAddresses": [],
            "People": [],
            "Id": "11",
            "InvHostName": "NYCRMR-TWX9000",
            "InvDomain": "blah.masked.com",
            "InvSerialNumber": "86753091",
            "InvDevType": "Workstation",
            "InvRegion": "NA",
            "InvLocation": "114AP2",
            "InvNetwork": "WMG",
            "InvBrand": "RMR",
            "InvProtectionStatus": null,
            "InvConversionStatus": null,
            "InvDeviceDob": "2023-10-23"
        }, {
            "InvStatus": {
                "Description": "Disconnected"
            },
            "DeviceAddresses": [],
            "People": [],
            "Id": "37",
            "InvHostName": "NYCRMR-TWX9002",
            "InvDomain": "blah.masked.com",
            "InvSerialNumber": "86753092",
            "InvDevType": "Workstation",
            "InvRegion": "NA",
            "InvLocation": "114AP4",
            "InvNetwork": "WMG",
            "InvBrand": "RMR",
            "InvProtectionStatus": null,
            "InvConversionStatus": null,
            "InvDeviceDob": "2023-10-23"
        }, {
            "InvStatus": {
                "Description": "Disconnected"
            },
            "DeviceAddresses": [],
            "People": [{
                    "Role": {
                        "Description": "Asset Manager"
                    },
                    "Id": "65571",
                    "Email": "[email protected]"
                }, {
                    "Role": {
                        "Description": "Primary Technical Contact"
                    },
                    "Id": "65477",
                    "Email": "[email protected]"
                }, {
                    "Role": {
                        "Description": "Asset User"
                    },
                    "Id": "65478",
                    "Email": "[email protected]"
                }, {
                    "Role": {
                        "Description": "Secondary Technical Contact"
                    },
                    "Id": "65479",
                    "Email": "[email protected]"
                }, {
                    "Role": {
                        "Description": "Secondary Technical Contact"
                    },
                    "Id": "65475",
                    "Email": "[email protected]"
                }
            ],
            "Id": "44",
            "InvHostName": "-0cc05ac548317d30c",
            "InvDomain": "WORKGROUP",
            "InvSerialNumber": "n/a",
            "InvDevType": "Server",
            "InvRegion": "NA",
            "InvLocation": "FREM45",
            "InvNetwork": "WMB",
            "InvBrand": "OKS",
            "InvProtectionStatus": null,
            "InvConversionStatus": null,
            "InvDeviceDob": "2021-05-03"
        }
    ]
}

我尝试一步完成所有操作,但只返回嵌套结果中的第一项。

接下来我尝试分多个步骤执行此操作,其中第一步检索第一级字段,第二步检索第二级字段,依此类推。

我的第一步是检索这些字段: PDI Screenshot 1

我的第二步是检索这些字段: PDI Screenshot 2

最终发生的情况是,第二步中的人员字段会复制到第一步中检索到的所有行,而不仅仅是导致复制到第一步中的第三条记录。

上面的 JSON 只是一个小样本,我要提取的实际记录超过 100k,我只想拥有与设备关联的人员记录。

arrays json pentaho-spoon pentaho-data-integration pdi
1个回答
0
投票

我能够解决这个问题,并想让其他寻找解决方案的人知道我是如何解决它的。

第二种方法是正确的路径,我将在第一步中解析出第一级字段,然后在第二步中解析出第二级字段。

我需要做的额外改动是将二级数组的第一级数组拉出到一个附加字段中,在我的示例中,我将其称为 PeopleData。这只是将那个小的 JSON 数组放入其自己的字段中,该字段直接与该行的数据相关联,而不是与其他所有行相关联。

见截图:PDI Screenshot 1

然后在下一步中,我简单地引用了新字段 JSON 并使用 [*] 解析该数据,因为这对于该行来说是唯一的,所以它保持了与顶层的关系完整。

见截图:PDI Screenshot 2

我希望这对某人有帮助,它让我沮丧地拔掉头发。

© www.soinside.com 2019 - 2024. All rights reserved.