2016-03-15 11 views
6

Quando si scrive uno script PowerShell con un ConvertFrom-Json, sembra che i valori negli array vengano convertiti con spazi aggiuntivi quando li si esegue in una stringa. Il codice seguente mostra questo in un esempio di codice piccolo:PowerShell ConvertFrom-Json con matrici aggiunge spazi aggiuntivi a un valore di matrice

$object = @" 
    { 
      "object": 
      {    
      "prop1": "value", 
      "array":[ 
       { "key": "value"}, 
       { "key2": "valuevalue"}, 
       { "key3": "valuevalue"}, 
       { "key4": "valuevalue"}, 
       { "key5": "valuevalue"} 
      ] 
      } 
    } 
"@ | ConvertFrom-Json 

$object.object.prop1 
$object.object.array.key 

$t = $object.object.prop1 
$t2= $object.object.array.key 
"""$t""" 
"""$t2""" 

uscita:

value 
value 
"value" 
"value " 

Dove sono gli spazi in più provenienti dalla nell'ultimo valore? Quando si aggiungono più coppie di valori all'array, vengono aggiunti più spazi.

+1

Se si imposta $ OFS su "" (stringa nulla) influisce sull'output? – mjolinor

+0

Sì, funziona idd, ma perché gli spazi sono stati aggiunti? – Peter

+0

Non posso dirlo con certezza, ma sembra che l'intero array sia lanciato su [stringa] sotto le coperte, a giudicare dai sintomi. $ OFS è una variabile automatica che specifica un separatore che verrà utilizzato per separare gli elementi dell'array quando l'array viene castato su [stringa]. L'impostazione predefinita è un singolo spazio. Impostarlo su null ha eliminato gli spazi. – mjolinor

risposta

7

Non si tratta di ConvertFrom-Json, si tratta di $array.value. A partire da v3 o v4 PowerShell consente di ottenere la proprietà specificata degli elementi dell'array utilizzando la notazione a punti. Se manca una proprietà, il risultato è nullo a meno che non sia attiva la modalità rigorosa. In quest'ultimo caso fallisce.

Ecco l'esempio:

$array = @(
    [PSCustomObject]@{key = 'value'} 
    [PSCustomObject]@{key2 = 'valuevalue'} 
) 

$result = $array.key 
$result.GetType().Name 
"[$result]" 

uscita (notare il tipo di risultato e lo spazio extra)

Object[] 
[value ] 

Così il risultato è un array. Quando si esegue il cast di una matrice per la stringa, gli articoli sono uniti con uno spazio come separatore predefinito (può essere modificato da $OFS).

Se si esegue l'esempio precedente in PowerShell v2, viene ottenuto [] in quanto v2 non supporta per ottenere le proprietà degli elementi dell'array utilizzando la notazione dot.

Se si esegue l'esempio con Set-StrictMode -Version 2, si verifica un errore con un errore Impossibile trovare la chiave "proprietà" su questo oggetto. Fallisce in tutte le versioni di PowerShell. In v2 perché l'array non ha la proprietà key. In una versione successiva perché il secondo elemento dell'array non ha questa proprietà.

+1

Buona presa. Sta eseguendo l'enumerazione automatica dei membri su una serie di oggetti di proprietà singola dissimili. – mjolinor

0

Potrebbe avere più senso se si scrive la JSON come questo: "Chiave"

{ 
     "object": 
     {    
     "prop1": "value", 
     "array":[ 
      { "Property1": "value1"}, 
      { "Property1": "value2"}, 
      { "Property1": "value3"}, 
      { "Property1": "value4"}, 
      { "Property1": "value5"} 
     ] 
     } 
} 

In altre parole, si ottiene stringhe vuote sui membri di matrice successive, perché non hanno una proprietà di nome