json - 使用 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":""}]}
解决方案
多亏了 Doug Maurer 的评论,我才明白,当它应该在我的命令中时,我正在添加-Depth
到我的命令中。这是最终的脚本,它给了我什么:ConvertFrom-Json
ConvertTo-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"}]}]}]}
推荐阅读
- angular - 谷歌自动完成建议在角度不合适
- laravel - 将图像传递给引导模式
- openapi - 禁用跨控制器名称冲突的枚举行为
- sorting - 内部单个查询的弹性搜索排序结果应该 bool 查询
- java - Java java.lang.ClassCastException:javax.xml.bind.JAXBElement 在使用 IntelliJ 生成的代码时无法强制转换异常
- php - 我需要在 laravel 中按每个用户表显示数据
- c# - 在 C# 控制台应用程序中返回数组的平均值
- spring - 具有两个 DTO 的用户实体与两个实体 - UserLogin、User
- arrays - 计算何时方便利用过滤数组中的排序
- ios - react-native-push-notification onRegister 正确触发,但 onNotification 从未被捕获