2016-03-15 8 views
6

Podczas pisania skryptu Powerhell z ConvertFrom-Json wydaje się, że wartości w tablicach są konwertowane z dodatkowymi spacjami podczas rzutowania ich na ciąg. Poniższy kod pokazuje to w małej próbki kodu:Powershell ConvertFrom-Json z tablicami dodaje dodatkowe spacje do wartości tablicy

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

wyjściowa:

value 
value 
"value" 
"value " 

Gdzie są dodatkowe przestrzenie w pochodzące z ostatniej wartości? Podczas dodawania kolejnych par wartości do tablicy dodawane są kolejne spacje.

+1

Jeśli ustawisz $ OFS na '' (łańcuch zerowy), czy ma to wpływ na wynik? – mjolinor

+0

Tak, działa idd, ale dlaczego są dodawane spacje? – Peter

+0

Nie mogę powiedzieć na pewno, ale wygląda na to, że cała tablica jest rzutowana na [napis] pod okładkami, sądząc po objawach. $ OFS to automatyczna zmienna, która określa separator, który będzie używany do oddzielania elementów tablicy, gdy tablica jest rzutowana na [string]. Wartość domyślna to pojedyncza spacja. Ustawienie wartości null wyeliminowało spacje. – mjolinor

Odpowiedz

7

Nie chodzi o ConvertFrom-Json, chodzi o $array.value. Począwszy od wersji 3 lub 4 PowerShell pozwala uzyskać określoną właściwość elementów tablicy za pomocą notacji kropkowej. Jeśli brakuje właściwości, wynik jest zerowy, chyba że włączony jest tryb ścisły. W tym ostatnim przypadku nie powiedzie się.

Oto przykład:

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

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

Output (nota typ wynik i dodatkową przestrzeń)

Object[] 
[value ] 

więc wynik jest tablicą. Kiedy rzucasz tablicę, której łańcuchy są oznaczone, to łączy się z spacją jako domyślnym separatorem (może być zmieniona przez $OFS).

Jeśli uruchomisz powyższy przykład w PowerShell v2, otrzymasz [], ponieważ v2 nie obsługuje uzyskiwania właściwości elementu tablicy za pomocą notacji kropkowej.

Jeśli uruchomisz przykład z Set-StrictMode -Version 2, to nie powiedzie się z błędem "Klucz" właściwości nie może zostać znaleziony na tym obiekcie. Błąd we wszystkich wersjach PowerShell. W wersji 2, ponieważ tablica nie ma właściwości key. W późniejszej wersji, ponieważ drugi element tablicy nie ma tej właściwości.

+1

Dobry połów. Wykonuje automatyczne wyliczanie elementów na tablicy różnych obiektów pojedynczych. – mjolinor

0

może więcej sensu, jeśli piszesz json tak: „Klucz”

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

Innymi słowy, można dostać pustych strun na kolejnych członków tablicy, ponieważ nie mają one właściwość o nazwie

Powiązane problemy