3 votes

Powershell Pourquoi la différence entre les deux contenus json ?

J'ai deux variables de Byte[] (J'ai choisi ce type pour un besoin spécifique, il doit donc être conservé.) qui sont déclarés comme suit :

$first = New-Object Byte[] 32
$second = New-Object Byte[] 32

et, j'ai mis en majuscules chaque indice des deux variables.

Maintenant, j'ai créé une table de hachage $List1 comme :

$List1=@{"First" = $first; "Second" = $second}

J'utilise la syntaxe ci-dessous pour créer le fichier json :

$List1 | ConvertTo-Json | Set-Content  -Path $jsonFile1

C'est le premier contenu du fichier json :

{
"First":  {
             "value":  [
                           210,
                           195,
                           131,
                           176,
                           88,
                           154,
                           57,
                           37,
                           2,
                           75,
                           182,
                           190,
                           156,
                           43,
                           113,
                           199,
                           63,
                           25,
                           109,
                           92,
                           220,
                           91,
                           219,
                           252,
                           113,
                           68,
                           202,
                           12,
                           147,
                           194,
                           36,
                           177
                       ],
             "Count":  32
         },
"Second":  {
           "value":  [
                         238,
                         225,
                         12,
                         172,
                         134,
                         94,
                         42,
                         204,
                         27,
                         78,
                         39,
                         166,
                         229,
                         111,
                         143,
                         254
                     ],
           "Count":  16
       }
}

Puis je lis le premier fichier json dans une variable temporaire comme ci-dessous :

$tempHash = Get-Content -Path $jsonFile1 -Raw| ConvertFrom-Json

Desde $tempHash est un PSCustomObject je crée une nouvelle table de hachage $List2 comme ci-dessous :

$List2 = @{"First" = $tempHash.First.value; "Second"= $tempHash.Second.value}

que j'utilise pour créer le second fichier json comme ci-dessous :

$List2 | ConvertTo-Json | Set-Content  -Path $jsonFile2

C'est le deuxième contenu du fichier json :

    {
"First":  [
             133,
             231,
             19,
             173,
             60,
             50,
             105,
             68,
             38,
             109,
             99,
             155,
             2,
             188,
             216,
             9,
             8,
             225,
             203,
             15,
             167,
             8,
             188,
             76,
             192,
             154,
             183,
             194,
             1,
             122,
             143,
             137
         ],
"Second":  [
           27,
           3,
           57,
           67,
           155,
           145,
           181,
           194,
           250,
           10,
           65,
           90,
           41,
           230,
           243,
           196
       ]
}

J'utilise la même syntaxe pour créer les deux fichiers json. Alors, pourquoi leurs structures sont-elles différentes ?

[Edit]

Je soupçonne que la différence est due à cette même syntaxe :

$List1=@{"First" = $first; "Second" = $second}

parce que Byte[] ne fonctionne pas comme une simple variable de type integer[] type de variable. Corrigez-moi.

[Edit]

Donc, il s'avère que Byte[] La variable de type a deux clés différentes. "value" qui contient le tableau réel des valeurs d'octets, et "Count", qui contient le nombre d'éléments dans le tableau. Byte[] variable. Cependant, lorsque nous invoquons la Byte[] comme une variable de type :

$first

qui est de Byte[] on obtient uniquement les valeurs listées sous la clé "value". La valeur de la clé "count" n'est jamais affichée dans la console, mais elle est transmise à la table de hachage d'une manière ou d'une autre.

Et, un autre point à noter. Si j'utilise :

 $List2 = @{"First" = $tempHash.First; "Second"= $tempHash.Second}

alors, je vais devoir utiliser :

$List2.First.Value #to get the value of the "First" key

et ça me met mal à l'aise parce que pour la $List1 hashtable, j'ai seulement eu besoin d'utiliser :

 $List1.First #to get the value of the "First" key.

[Contournement]

J'ai créé une table de hachage $List comme la table de hachage originale, comme ci-dessous, pour des raisons strictes. à usage unique :

$List | ConvertTo-Json | Set-Content  -Path $jsonFile

Ensuite, j'ai créé deux tables de hachage $List1 y $List2 comme ci-dessous à partir de l'original $jsonFile ci-dessus.

 $tempHash = Get-Content -Path $jsonFile -Raw| ConvertFrom-Json
 $List1 = @{"First" = $tempHash.First; "Second" = tempHash.Second}
 $List2 = @{"First" = $tempHash.First; "Second" = tempHash.Second}

Cela m'a aidé à garder une certaine cohérence tout en faisant référence à leurs clés et valeurs.

Maintenant, j'utilise

#to fetch the values of the "First" keys of both hashtables.
$List1.First.value #and
$List2.First.value

De même, je fais la même chose pour la clé "Second" pour les deux hashtables. $List1 y $List2 .

#to fetch the values of the "Second" keys of both hashtables.
$List1.Second.value #and
$List2.Second.value

[Edit]

Il s'est avéré être un bogue dans ma version de Powershell comme indiqué par @mklement0 ci-dessous. La solution parfaite sera d'utiliser la syntaxe ci-dessous comme indiqué par @mklement0 :

# Ensure that the input array is constructed without the extra [psobject] wrapper.
$First = [Byte[]]::new(32)
$Second = [Byte[]]::new(32)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X