2015-10-09 12 views
5

Ho una parte di codice che funziona ma voglio sapere se c'è un modo migliore per farlo. Non ho trovato nulla di simile finora. Ecco i fatti:Come escludere le proprietà degli oggetti non di valore durante la conversione in JSON in Powershell

  • Ho un oggetto con n proprietà.
  • Voglio convertire questo oggetto in JSON utilizzando (ConvertTo-Json).
  • Non voglio includere nel JSON quelle proprietà dell'oggetto che non sono valutate.

Costruire l'oggetto (non veramente importante):

$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 "" 

La linea che ho bisogno miglioramenti (per filtrare le proprietà non-valore e non includerli nella 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 

Che questa linea offre:

Results: 
{ 
    "TableName": "MyTable", 
    "Description": "Lorem ipsum dolor..", 
    "AppArea": "UserMgmt", 
    "InitialVersion": null 
} 

What I want to obtain: 
{ 
    "TableName": "MyTable", 
    "Description": "Lorem ipsum dolor..", 
    "AppArea": "UserMgmt" 
} 

quello che ho provato e funziona, ma non mi piace dal momento che ho molto di più oggetti da gestire:

$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 

risposta

7

Qualcosa di simile?

$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 "" 

# 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 
} 

Risultato:

{ 
    "TableName": "MyTable", 
    "Description": "Lorem ipsum dolor..", 
    "AppArea": "UserMgmt" 
} 
+0

Sì, questo sembra funzionare ed è più pulito. Grazie! –