PowerShell probléma: sztringet csinál a tömbből

0 votes
asked Apr 10, 2016 in IRF tantárgy by juhaszbalint (52 points)  
edited Apr 10, 2016 by juhaszbalint

probléma reprodukálása:

$array = @("a","b","c")
$data = @{"sub" = @{"sub-sub" = $array}}
$output = @{"root" = $data}

ConvertTo-Json -InputObject $data
ConvertTo-Json -InputObject $output

Van egy $userDataObject változóm amit így hozok létre:

$userDataObject = New-Object -TypeName PSObject -Property @{}

És így adok hozzá:

$userDataObject | Add-Member "user" @{"key" = $valueArray}

Ha erre a userDataObject-re ráküldöm a ConvertTo-Json-t akkor szépen bekerülnek a valueArray elemei szögletes zárójelek közé.
Ellenben ha a meglévő userDataObject-et rakom bele egy hashtable-be:

$output = New-Object -TypeName PSObject -Property @{}
$output | Add-Member "result" $userDataObject

Akkor hopp, volt array nincs array. Lett belőle egy sima string. Mindent próbáltam már. Illetve minden zavaró tényezőt is eltüntettem. Kiiratom a userDataObject-et, létrehozom az $output-ot és azt is rögtön kiiratom. Egyszerűen nem tudok mit kezdeni a powershell típuskezelésével. Nem tudom hol nyúlhatnék bele amitől a string array-ek maradnak string array-ek.

Az elkeserítő kimenetek:

$userDataObject json-ná alakítva (itt még minden rendben van):

"meres":  {
    "groups":  [
        "wheel",
        "meres",
        "pegasus"
    ],
    "id":  "1000",
    "home":  "/home/meres"
},

$output json-ná alakítva (ezt meg mégis hogy találta ki?):

"meres":  {
    "groups":  "wheel meres pegasus",
    "id":  "1000",
    "home":  "/home/meres"
},

1 Answer

+2 votes
answered Apr 10, 2016 by juhaszbalint (52 points)  
selected Apr 10, 2016 by benedekh
 
Best answer

Megoldás: ConvertTo-Json -InputObject $output -Depth 3

A mélység default 2, de ha 3-ra állítod, a ConvertTo-Json feltérképezi a 3-as mélységű értékeket is, ezért fogjuk látni a tömböt.

Ez mind szép és jó, de akkor miért lett string a tömbből 2-es depth-nél?

Ha kiadom a parancsot Depth 1-gyel:

{ "root": { "sub":  "System.Collections.Hashtable" }}

Érdekes módon ennek van értelme. Nem néz bele a Hashtable-be, ezért csak a típusát adja vissza.

Akkor viszont a -Depth 2 miért ezt adja vissza:

{ "root": { "sub": { "sub-sub": "a b c" } }}

Ehelyett:

{ "root": { "sub": { "sub-sub": "System.Object[]" } }}

Válasz: Azért, mert a ConvertTo-Json a nem kifejtett objektumokat [string]-ként cast-olja, nem pedig $obj | Out-String-ként.

...