首页 > 解决方案 > 使用 Powershell 将 JSON 转换为 NDJSON

问题描述

我正在尝试将具有 json 对象数组的文本文件转换为 NDJSON 格式的文件,以供另一个团队使用。

我几乎得到它,除了一个问题。我有一个嵌套在 JSON 中的对象数组(然后其中有嵌套的数组和对象,结构变得非常复杂,我将在下面包含一个示例)并且无论出于何种原因,当我使用 ConvertFrom-JSON 时,它会丢弃这个嵌套数组,在我的输出中,我最终得到了该键的空白字符串,而不是嵌套数组对象。我尝试使用 -Depth 标志,但是当我这样做时,我的输出文件最终为空白,这对我来说没有多大意义。我对powershell没有很多经验,所以我不确定我在哪里出错了。

代码:

$JSONSourceFile = Get-Content -Path "input/sample.json" | ConvertFrom-JSON
$NDJSONTargetFile = "output/sample.json"
New-Item $NDJSONTargetFile -ItemType file
for ( $i = 0 ; $i -lt $JSONSourceFile.Length ; $i++) {
  $item = $JSONSourceFile.item($i)
  $row = ($item | ConvertTo-JSON -Compress)
  Add-Content $NDJSONTargetFile $row
}

输入文件:

[
{
    "id": "1",
    "TransactionDttm": "2021-02-22T15:45:00:00.000-05:00",
    "Array1": [
        {
            "UserID": "ak2354",
            "Preferences": [
                {
                    "CagegoryID": "01",
                    "CategoryName": "Reminder",
                    "Channels": [
                        {
                            "ChannelID": "1",
                            "ChannelName": "Email",
                            "Preference": "Y"
                        },
                        {
                            "ChannelID": "2",
                            "ChannelName": "Text",
                            "Preference": "N"
                        }
                    ]
                }
            ]
        }
    ]
},
{
    "id": "2",
    "TransactionDttm": "2021-02-22T15:45:00:00.000-05:00",
    "Array1": [
        {
            "UserID": "ak1234",
            "Preferences": [
                {
                    "CagegoryID": "01",
                    "CategoryName": "Reminder",
                    "Channels": [
                        {
                            "ChannelID": "1",
                            "ChannelName": "Email",
                            "Preference": "Y"
                        },
                        {
                            "ChannelID": "2",
                            "ChannelName": "Text",
                            "Preference": "Y"
                        }
                    ]
                }
            ]
        }
    ]
},
{
    "id": "3",
    "TransactionDttm": "2021-02-22T15:45:00:00.000-05:00",
    "Array1": [
        {
            "UserID": "ak5678",
            "Preferences": [
                {
                    "CagegoryID": "01",
                    "CategoryName": "Reminder",
                    "Channels": [
                        {
                            "ChannelID": "1",
                            "ChannelName": "Email",
                            "Preference": "N"
                        },
                        {
                            "ChannelID": "2",
                            "ChannelName": "Text",
                            "Preference": "N"
                        }
                    ]
                }
            ]
        }
    ]
}
]

然后当我将它转换为输出时,这就是我得到的:

{"id":"1","TransactionDttm":"2021-02-22T15:45:00:00.000-05:00","Array1":[{"UserID":"ak2354","Preferences":""}]}
{"id":"2","TransactionDttm":"2021-02-22T15:45:00:00.000-05:00","Array1":[{"UserID":"ak1234","Preferences":""}]}
{"id":"3","TransactionDttm":"2021-02-22T15:45:00:00.000-05:00","Array1":[{"UserID":"ak5678","Preferences":""}]}

标签: jsonpowershell

解决方案


多亏了 Doug Maurer 的评论,我才明白,当它应该在我的命令中时,我正在添加-Depth到我的命令中。这是最终的脚本,它给了我什么:ConvertFrom-JsonConvertTo-Json

$JSONSourceFile = Get-Content -Path "input/sample.json" | ConvertFrom-JSON
$NDJSONTargetFile = "output/sample.json"
New-Item $NDJSONTargetFile -ItemType file
for ( $i = 0 ; $i -lt $JSONSourceFile.Length ; $i++) {
  $item = $JSONSourceFile.item($i)
  $row = ($item | ConvertTo-JSON -Compress -Depth 20)
  Add-Content $NDJSONTargetFile $row
}

和输出:

{"id":"1","TransactionDttm":"2021-02-22T15:45:00:00.000-05:00","Array1":[{"UserID":"ak2354","Preferences":[{"CagegoryID":"01","CategoryName":"Reminder","Channels":[{"ChannelID":"1","ChannelName":"Email","Preference":"Y"},{"ChannelID":"2","ChannelName":"Text","Preference":"N"}]}]}]}
{"id":"2","TransactionDttm":"2021-02-22T15:45:00:00.000-05:00","Array1":[{"UserID":"ak1234","Preferences":[{"CagegoryID":"01","CategoryName":"Reminder","Channels":[{"ChannelID":"1","ChannelName":"Email","Preference":"Y"},{"ChannelID":"2","ChannelName":"Text","Preference":"Y"}]}]}]}
{"id":"3","TransactionDttm":"2021-02-22T15:45:00:00.000-05:00","Array1":[{"UserID":"ak5678","Preferences":[{"CagegoryID":"01","CategoryName":"Reminder","Channels":[{"ChannelID":"1","ChannelName":"Email","Preference":"N"},{"ChannelID":"2","ChannelName":"Text","Preference":"N"}]}]}]}

推荐阅读