powershell - 需要从 Powershell JSON 嵌套对象中删除值和计数
问题描述
在 powershell 中,我试图通过对产品进行分组,将 CSV 文件转换为带有 Size 对象嵌套数组的 JSON。在下面的代码中 $ProductLines 来自 CSV 文件作为 powershell 对象。
$UniqueProducts = $ProductLines | Group-Object -Property 'ProductNumber' | ForEach-Object {
$SizeObj = ($_.Group | Select-Object -Property `
@{name="SizeCode"; Expression = {$_.Sizes}}, @{name="UPC"; Expression = {$_.UPCNo}} `
)
#$SizeObj | ConvertTo-Json -depth 10 | Out-File "C:\POWERSHELL\Sizes.txt"
$_.Group | Select-Object -Property ProductNumber, ProductName, `
@{name="Sizes"; Expression = {$SizeObj}} -Unique
}
$UniqueProducts | ConvertTo-Json -depth 10 | Out-File "C:\POWERSHELL\UniqueProducts.txt"
上面的代码生成具有以下结构的 JSON 文件,附加层值:和计数:
[
{
"ProductNumber": "EBAGS101-00008",
"ProductName": "EBAGS101",
"Sizes": {
"value": [
{
"SizeCode": "XS",
"UPC": "201112291509"
},
{
"SizeCode": "S",
"UPC": "201112291510"
}
],
"Count": 2
}
},
{
"ProductNumber": "EBAGS101-001",
"ProductName": "EBAGS101",
"Sizes": {
"value": [
{
"SizeCode": "XS",
"UPC": ""
},
{
"SizeCode": "S",
"UPC": "098617106215"
}
],
"Count": 2
}
}
]
如何从结果中删除value和Count层。当我只输出 $SizeObj 时,它没有 value 和 Count,我不确定value和Count如何在 $UniquProducts 中结束。在我的最终结果中,我尝试以以下格式创建 SizeObj(没有值和计数):
"Sizes": [
{
"SizeCode": "XS",
"UPC": "201112291509"
},
{
"SizeCode": "S",
"UPC": "201112291510"
}
]
更新:这里使用@RoadRunner 提供的答案是带有 csv 源的修改后的解决方案;其中 $ProductLines 是从 csv 文件转换的 Powershell 对象:
$Products = New-Object -TypeName System.Collections.ArrayList
$ProductLines | Group-Object -Property 'ProductNumber' | ForEach-Object {
$SizeRanges = New-Object -TypeName System.Collections.ArrayList
foreach ($object in $_.Group) {
$SizeVal = [PSCustomObject]@($object | Select-Object -Property `
@{name="SizeCode"; Expression = {$_.Sizes}}, `
@{name="UPC"; Expression = {$_.UPCNo}}`
)
$SizeRanges.AddRange($SizeVal)|Out-Null
}
$grp = $_.Group[0];
$product = [PSCustomObject]@{
ProductNumber = $grp.ProductNumber
ProductName = $grp.ProductName
Sizes = $SizeRanges
}
$products.Add($product)|Out-Null
} | ConvertTo-Json -Depth 3 | Out-File -FilePath output.json
解决方案
我只是用你想保留的属性重建 JSON。
Get-Content
首先,您可以使用和获取 JSON 数据ConvertFrom-Json
。然后,您可以迭代每个 JSON 对象,创建一个新对象,PSCustomObject
该对象保留ProductNumber
和属性,其中ProductName
只是来自 的数组。然后我们可以用 转换为 JSON 结构,用保持前三个级别,然后用 .将结果导出到输出文件。Sizes
Sizes
Sizes.value
ConvertTo-Json
-Depth 3
Out-File
$json = Get-Content -Path .\data.json | ConvertFrom-Json
& {
foreach ($object in $json)
{
[PSCustomObject]@{
ProductNumber = $object.ProductNumber
ProductName = $object.ProductName
Sizes = $object.Sizes.value
}
}
} | ConvertTo-Json -Depth 3 | Out-File -FilePath output.json
您可能还可以将上述逻辑集成到您已经拥有的内容中,因此您不需要首先重建 JSON。不幸的是,我无法真正展示如何做到这一点,因为我只能看到您正在生成的 JSON,所以我只能推荐一种解决方案来根据您的要求重建 JSON。
输出.json
[
{
"ProductNumber": "EBAGS101-00008",
"ProductName": "EBAGS101",
"Sizes": [
{
"SizeCode": "XS",
"UPC": "201112291509"
},
{
"SizeCode": "S",
"UPC": "201112291510"
}
]
},
{
"ProductNumber": "EBAGS101-001",
"ProductName": "EBAGS101",
"Sizes": [
{
"SizeCode": "XS",
"UPC": ""
},
{
"SizeCode": "S",
"UPC": "098617106215"
}
]
}
]
推荐阅读
- floating-point - 如何以最大精度将 5 个浮点数平均编码为 4 个浮点数
- c# - 使用用户定义类型从 .net 调用 oracle 存储过程时出现问题
- python - Python 密码检查程序 - 与 .pop() 值的比较不起作用
- python - 正则表达式拆分缩写名字的大写字母和句点的组合
- sql - 通过 cmd 面板使用本地 .bak 文件恢复在线 SQL Server 数据库
- java - 为什么需要使用 Set 覆盖 equals() 和 hashcode() 进行多值关联?
- java - 如何将 f(x) 作为用户输入并使其像使用 java 代码的公式一样工作?
- uwp-xaml - UWP XAML:Bindings.Update() 不会触发内部项目
- javascript - 允许任何拥有sails 政策的人访问API
- sqlite - SQLite SUM 返回整数?