如果我有这样的 JSON:
$inputJson = @"
{
"attachments" :
[
{
"name": "attachment.eml",
"attachment_url": "https://www.attachment1.com"
},
{
"name": "attachment.eml",
"attachment_url": "https://www.attachment2.com"
},
{
"name": "attachment.eml",
"attachment_url": "https://www.attachment3.com"
}
]
}
如果有一个attachments
数组,并且该数组中的每个元素都具有相同的名称但不同的 URL,我该如何更改所有名称以使其输出如下:
$outputJson = @"
{
"attachments" :
[
{
"name": "(attachment.eml)[1].eml",
"attachment_url": "https://www.attachment1.com"
},
{
"name": "(attachment.eml)[2].eml",
"attachment_url": "https://www.attachment2.com"
},
{
"name": "(attachment.eml)[3].eml",
"attachment_url": "https://www.attachment3.com"
}
]
}
"@
它重命名每个附件以防止重复名称,但它保留了 URL。
理想情况下,代码还将确保数组中不存在任何新名称。因此,如果(attachment.eml)[1].eml
数组中已经有一个附件,它也会处理它。
我曾想过以某种方式使用,Group-Object
但我还没有完全弄清楚如何使其工作。
请求代码在这里被认为是题外话。但是,出于自我训练的目的,以下代码片段可以完成这项工作。部分注释并逐项列出(辅助)中间变量:
$inputJson = @"
{
"attachments" :
[
{
"name": "(attachment.eml)[2].eml",
"attachment_url": "https://www.attachment222.com"
},
{
"name": "attachmentOne.eml",
"attachment_url": "https://www.attachmentOne.com"
},
{
"name": "attachment.eml",
"attachment_url": "https://www.attachment1.com"
},
{
"name": "attachment.eml",
"attachment_url": "https://www.attachment2.com"
},
{
"name": "attachment.eml",
"attachment_url": "https://www.attachment3.com"
},
{
"name": "attachmnt.eml",
"attachment_url": "https://www.attachmnt1.com"
},
{
"name": "attachmnt.eml",
"attachment_url": "https://www.attachmnt2.com"
}
]
}
"@
$objectJson = $inputJson | ConvertFrom-Json
$AttachsGrouped = $objectJson.attachments | Group-Object -Property Name
$newAttachments = $AttachsGrouped | ForEach-Object {
# debug output
write-host $_.Count, $_.Group.GetType().Name, $_.name -ForegroundColor Cyan
if ( $_.Count -gt 1 ) {
$addCnt = 1
$( for ( $i = 0; $i -lt $_.Count; $i++ )
{
# make sure none of the new names already exist in the array
While ( "($($_.name))[$($i+$addCnt)].eml" -in
$objectJson.attachments.name ) { $addCnt++ }
[PSCustomObject]@{
'name' = "($($_.name))[$($i+$addCnt)].eml"
'attachment_url' = $_.Group[$i].attachment_url
}
}
)
} else {
# retain original definition
$_.Group[0]
}
}
$outputJson = [PSCustomObject]@{
# for better output readability
'attachments' = $newAttachments | Sort-Object -Property Name
}
# result
$outputJson # | ConvertTo-Json -Depth 2
结果:
$outputJson
attachments ----------- {@{name=(attachment.eml)[1].eml; attachment_url=https://www.attachment1.com},...
$outputJson.Attachments
name attachment_url ---- -------------- (attachment.eml)[1].eml https://www.attachment1.com (attachment.eml)[2].eml https://www.attachment222.com (attachment.eml)[3].eml https://www.attachment2.com (attachment.eml)[4].eml https://www.attachment3.com (attachmnt.eml)[1].eml https://www.attachmnt1.com (attachmnt.eml)[2].eml https://www.attachmnt2.com attachmentOne.eml https://www.attachmentOne.com
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句