How to exclude non-valued object properties when converting to JSON in Powershell How to exclude non-valued object properties when converting to JSON in Powershell json json

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