How to exclude non-valued object properties when converting to JSON in Powershell
Something like this?
$object = New-Object PSObjectAdd-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 ""# Iterate over objects$object | ForEach-Object { # Get array of names of object properties that can be cast to boolean TRUE # PSObject.Properties - https://msdn.microsoft.com/en-us/library/system.management.automation.psobject.properties.aspx $NonEmptyProperties = $_.psobject.Properties | Where-Object {$_.Value} | Select-Object -ExpandProperty Name # Convert object to JSON with only non-empty properties $_ | Select-Object -Property $NonEmptyProperties | ConvertTo-Json}
Result:
{ "TableName": "MyTable", "Description": "Lorem ipsum dolor..", "AppArea": "UserMgmt"}
I have the following function in my profile for this purpose. Advantage: I can pipe a collection of objects to it and remove nulls from all the objects on the pipeline.
Function Remove-Null { [cmdletbinding()] param( # Object to remove null values from [parameter(ValueFromPipeline,Mandatory)] [object[]]$InputObject, #By default, remove empty strings (""), specify -LeaveEmptyStrings to leave them. [switch]$LeaveEmptyStrings ) process { foreach ($obj in $InputObject) { $AllProperties = $obj.psobject.properties.Name $NonNulls = $AllProperties | where-object {$null -ne $obj.$PSItem} | where-object {$LeaveEmptyStrings.IsPresent -or -not [string]::IsNullOrEmpty($obj.$PSItem)} $obj | Select-Object -Property $NonNulls } }}
Some examples of usage:
$AnObject = [pscustomobject]@{ prop1="data" prop2="moredata" prop5=3 propblnk="" propnll=$null}$AnObject | Remove-Nullprop1 prop2 prop5----- ----- -----data moredata 3$ObjList =@( [PSCustomObject]@{ notnull = "data" more = "sure!" done = $null another = "" }, [PSCustomObject]@{ notnull = "data" more = $null done = $false another = $true })$objList | Remove-Null | fl #format-list because the default table is misleadingnotnull : datamore : sure!notnull : datadone : Falseanother : True
beatcracker's helpful answer offers an effective solution; let me complement it with a streamlined version that takes advantage of PSv4+ features:
# Sample input object$object = [pscustomobject] @{ TableName = 'MyTable' Description = 'Lorem ipsum dolor...' AppArea = 'UserMgmt' InitialVersionCode = $null}# Start with the list of candidate properties.# For simplicity we target *all* properties of input object $obj# but you could start with an explicit list as wellL# $candidateProps = 'TableName', 'Description', 'AppArea', 'InitialVersionCode'$candidateProps = $object.psobject.properties.Name# Create the filtered list of those properties whose value is non-$null# The .Where() method is a PSv4+ feature.$nonNullProps = $candidateProps.Where({ $null -ne $object.$_ })# Extract the list of non-null properties directly from the input object# and convert to JSON.$object | Select-Object $nonNullProps | ConvertTo-Json