我有一段代码,但我想知道是否有更好的方法来做。到目前为止,我找不到任何相关的东西。以下是事实:
- 我有一个有n个属性的对象。
- 我想使用(ConvertTo-JSON)将此对象转换为JSON。
- 我不想在JSON中包含那些没有值的对象属性。
创建对象(并不重要):
$object = New-Object PSObject
Add-Member -InputObject $object -MemberType NoteProperty -Name TableName -Value "MyTable"
Add-Member -InputObject $object -MemberType NoteProperty -Name Description -Value "Lorem ipsum dolor.."
Add-Member -InputObject $object -MemberType NoteProperty -Name AppArea -Value "UserMgmt"
Add-Member -InputObject $object -MemberType NoteProperty -Name InitialVersionCode -Value ""
我需要改进的那一行(过滤掉非值属性,不在JSON中包含它们)
# So I want to 'keep' and deliver to the JSON only the properties that are valued (first 3).
$object | select -Property TableName, Description, AppArea, InitialVersion | ConvertTo-Json
这条线提供的是:
Results:
{
"TableName": "MyTable",
"Description": "Lorem ipsum dolor..",
"AppArea": "UserMgmt",
"InitialVersion": null
}
What I want to obtain:
{
"TableName": "MyTable",
"Description": "Lorem ipsum dolor..",
"AppArea": "UserMgmt"
}
我已经尝试过了,但我不喜欢它,因为我有更多的属性要处理:
$JSON = New-Object PSObject
if ($object.TableName){
Add-Member -InputObject $JSON -MemberType NoteProperty -Name TableName -Value $object.TableName
}
if ($object.Description){
Add-Member -InputObject $JSON -MemberType NoteProperty -Name Description -Value $object.Description
}
if ($object.AppArea){
Add-Member -InputObject $JSON -MemberType NoteProperty -Name AppArea -Value $object.AppArea
}
if ($object.InitialVersionCode){
Add-Member -InputObject $JSON -MemberType NoteProperty -Name InitialVersionCode -Value $object.InitialVersionCode
}
$JSON | ConvertTo-Json
4条答案
按热度按时间x0fgdtte1#
像这样吗
测试结果:
wr98u20j2#
我在我的个人资料中为此目的设置了以下功能。优点:我可以将一个对象集合通过管道传递给它,并从管道上的所有对象中删除null。
一些用法示例:
mwg9r5ms3#
beatcracker's helpful answer提供了有效的解决方案;让我用一个利用PSv 4+功能的精简版本来补充它:
gajydyqb4#
我自己修改了batmanama's answer,它接受了一个额外的参数,允许您删除该参数中列表中的元素。举例来说:
我已经发布了一个gist版本,包括PowerShell文档。
请注意,这里的process块自动迭代管道对象,因此当一个项显式传递到数组中(例如将其 Package 在单个元素数组
,$array
中)或作为直接参数提供时(例如Remove-Null -InputObject $(Get-ChildItem)
),ForEach只会重复执行一次。值得一提的是,mine和batmanama的函数都将从 * 每个 * 单独的对象中删除这些属性。这就是它如何正确利用PowerShell管道的方式。此外,这意味着如果InputObject中的任何对象具有 * 不 * 匹配的属性(例如,它们notnull),输出表仍将显示该属性,即使它已从其他 * 确实 * 匹配的项中删除了这些属性。
这里有一个简单的例子来展示这种行为: